|
March 29th, 2021
09:53 am - Кресты -- говно Рассмотрим сферический пример в вакууме: две проце дуры, каждая из которых итерирует последовательный коньтейнер и добавляет туда элементы.
#include <iostream>
#include <vector>
#include <list>
using namespace std;
void fart1()
{
vector<int> c;
c.push_back(1);
for(auto a:c) {
c.push_back(a++);
if (c.size()>10) break;
}
cout<<"Count:"<<c.size()<<"\n";
}
void fart2()
{
list<int> c;
c.push_back(1);
for(auto a:c) {
c.push_back(a++);
if (c.size()>10) break;
}
cout<<"Count:"<<c.size()<<"\n";
}
int main()
{
fart1();
fart2();
return 0;
}
Казалось бы, в языке здорового человека никаких различий быть не может. Но плюсы считают по-другому:
[stk@archtest Source]$ ./cppshit
Count:2
Count:11
ибо у этих пидоров реализация течёт сквозь абстракцию даже в стандартной библиотеке, причём на официальном, мать их, уровне.
|
Comments:
прикольно. а почему так? препроцессор по разному раскручивает заголовок цикла для вектора и для листа?
Не-а. Там в любом случае синтаксических сахар для константного итератора. Просто в векторе push_back изменяет конечный итератор, а в листе нет (так как векторе это ссылка на следующую ячейку памяти, а в листе -- указатель на специалный объект). Поэтому итерируя вектор мы доходим до условия конца цикла, а итерируя лист -- не дойдём никогда, так как перед конечным элементом всегда будет появляться новый элемент.
Это, собственно, и есть протечка: поведение абстрактной операции итерации по изменяющемуся контейнеру зависит от реализации этого самого контейнера.
прикол! с другой стороны в этом вся философиия крестов, в погоне за эффективностью, они не формулируют никаких жостких абстракций, а идут на поводу у эффективной реализации, и отличия реализации (сcылка на следующую ячейку памяти -- указатель на специальный обьект) проявляются такими уродждивыми абузами абстракции.
From: | (Anonymous) |
Date: | March 29th, 2021 - 04:42 pm |
---|
| | | (Link) |
|
ебать сколько умных слов а пишешь хуйню какуюто
даа..нельзя чтобы реализация так абюзила абстракцию.. ну столлман со страуструпом исправят там.
From: | (Anonymous) |
Date: | March 29th, 2021 - 10:10 am |
---|
| | | (Link) |
|
Столлмана сначала нужно спасти. А кресты заменить на нормальный язык. А труп страуса, ну да фиг с ним.
ну пусть едет в Мариуполь, я его тут спрячу, еба.
Это традиция:
C++98: all the iterators and references before the insertion point remain valid.
C++21: references, pointers, and iterators before the insertion point remain valid but those at or after the insertion point, including the past-the-end iterator, are invalidated.
From: | (Anonymous) |
Date: | March 29th, 2021 - 10:18 am |
---|
| | | (Link) |
|
и на этом пишут браузеры? ужс
From: | (Anonymous) |
Date: | March 29th, 2021 - 10:29 am |
---|
| | | (Link) |
|
Да пошел ты нахуй.
From: | (Anonymous) |
Date: | March 29th, 2021 - 05:14 pm |
---|
| | | (Link) |
|
плюсоеб хуже пидораса
From: | (Anonymous) |
Date: | March 29th, 2021 - 05:18 pm |
---|
| | | (Link) |
|
Ёбаное блядское говно эти шаблонные контейнеры. Я в крестах свой набор рантаймово-полиморфных генериков использую, шарп/ява-стайл.
From: | (Anonymous) |
Date: | March 29th, 2021 - 08:46 pm |
---|
| | | (Link) |
|
Для эффективной защиты от рантаймово-полиморфных генериков необходимо применение проактивных методов защиты, таких как запрет не шаблонных контейнеров.
>свой набор рантаймово-полиморфных генериков использую
А поделиться?
Т.е. заворачивание инкремента в выражение в любом случае ведет себя неочевидно? |
|
|
LJ.Rossia.org |