Здравствуйте, c-smile, Вы писали:
CS>Вопрос состоит в следующем:
CS>Каждая переменная типа context содержит ссылку (указатель de facto) на CTX увеличивая тем самым размер стека функции. CS>Можно ли как-нибудь избавитсься от этой context::ctx переменной?
Компилятор может съоптимизировать это дело и не использовать дополнительный стек.
CS>Скажем в D я бы написал это как:
CS>
Здравствуйте, Centaur, Вы писали:
CS>>Каждая переменная типа context содержит ссылку (указатель de facto) на CTX увеличивая тем самым размер стека функции. CS>>Можно ли как-нибудь избавитсься от этой context::ctx переменной?
C>Преждевременная оптимизация — sqrt(∀evil). Оптимизирующий компилятор, скорее всего, выоптимизирует эту ссылку.
Я счастлив что ты знаешь эту хохму про premature optimization.
Не, ну шо за люди ... Я что спросил про "стоит ли оно оптимизации или нет"?
Задал же конкретный вопрос...
Правда по поводу стека всё равно спорно, т.к. для объектов с деструкторами компилятор обычно заводит на стеке вспомогательную переменную через которую отслеживает какие объекты были сконструированы, а какие — нет (что бы знать для каких звать деструкторы, а для каких нет). Я думаю, это в равной мере относится и к D.
Но если не используются исключения, или уже есть другие объекты с деструкторами, то это не должно влиять.
Если этот код будет в дллке, то тогда надо вручную через TlsAlloc();
CS>А так в принципе как вариант оченно даже ...
CS>А вот интересно какова цена доступа к __declspec(thread) переменной? CS>TLS как-нибудь через регистры процессора адресуется?
Там что-то типа двух косвенных обращений. Если использовать __declspec(thread), то они прямо будут встроены в твой код. Если же TlsAlloc(), то соотв. ещё будет вызов функции и ветвление.
Каждая переменная типа context содержит ссылку (указатель de facto) на CTX увеличивая тем самым размер стека функции.
Можно ли как-нибудь избавитсься от этой context::ctx переменной?
Здравствуйте, Centaur, Вы писали:
C>Без дополнительной информации я бы предположил, что копировать контекст нельзя — либо принципиально невозможно (поток ввода-вывода, объект со сложным поведением), либо слишком дорого (огромный массив данных).
Так его никто и не будет копировать, вообще-то...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, c-smile, Вы писали:
CS>Уверен что в C++ такой кунштюк не сделать но вдруг? Например средствами C++0x ...
Ну, как вариант, передавать в функцию не ссылку, а тот самый контекст...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, alexeiz, Вы писали:
A>Здравствуйте, c-smile, Вы писали:
CS>>Вопрос состоит в следующем:
CS>>Каждая переменная типа context содержит ссылку (указатель de facto) на CTX увеличивая тем самым размер стека функции. CS>>Можно ли как-нибудь избавитсься от этой context::ctx переменной?
A>Компилятор может съоптимизировать это дело и не использовать дополнительный стек.
Теоретически может но хотелось бы определенной определенности.
Здравствуйте, Erop, Вы писали:
E>Ну, как вариант, передавать в функцию не ссылку, а тот самый контекст...
Конструктор будет создаваться до входа в функцию (например до инициализхации всех остальных параметров) и соотв. после завершения функции (с этим еще можно жить).
На самом деле enter(CTX& ctx, ...) имеет ряд доп. параметров инициализируемых объектами в scope.
На самом деле это всё для TIScript. Вот реальный пример функции скрипта
Вызов protect() это именно то что хотелось сделать с пом. RAII.
protect в данном случае регистрирует адреса переменных на C стеке ибо
в строчках с //GC!! может произойти GC и соотв. vector например может переехать на новое место.
static value CSF_map(VM *c)
{
value vector = 0 ,cmpf = 0, cmpf_this = 0, r_vector = 0;
protect(c,vector,cmpf,cmpf_this, r_vector); // <<<<<<<< let GC to know about the locations.
CsParseArguments(c,"V=*V=|V",&vector,&CsVectorDispatch,&cmpf,&CsMethodDispatch,&cmpf_this);
FETCH(c, vector); // GC!!
int_t d = CsVectorSize(c,vector);
r_vector = CsMakeVector(c,d); // GC!!
int_t ndst = 0;
if(cmpf_this)
{
for( int n = 0; n < d; ++n )
{
value r = CsCallMethod(c,cmpf_this, cmpf, cmpf_this, 3, // GC!!
CsVectorElement(c,vector,n),
CsMakeInteger(n),
vector);
if( r == NOTHING_VALUE )
continue;
CsSetVectorElement(c,r_vector,ndst++,r);
}
}
....
}
Здравствуйте, c-smile, Вы писали:
CS>Пока пробую выкрутиться без применения RAII ...
IMHO, в большинстве случаев можно забить на экономию одной ссылки.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, alexeiz, Вы писали:
A>В любом случае, попробуй так:
A>void do_something(context ctx, ...) // by value, context ctor should be implicit
A>{...
Без дополнительной информации я бы предположил, что копировать контекст нельзя — либо принципиально невозможно (поток ввода-вывода, объект со сложным поведением), либо слишком дорого (огромный массив данных).
Здравствуйте, c-smile, Вы писали:
CS>Каждая переменная типа context содержит ссылку (указатель de facto) на CTX увеличивая тем самым размер стека функции. CS>Можно ли как-нибудь избавитсься от этой context::ctx переменной?
Преждевременная оптимизация — sqrt(∀evil). Оптимизирующий компилятор, скорее всего, выоптимизирует эту ссылку.
Здравствуйте, c-smile, Вы писали:
CS>А вот интересно какова цена доступа к __declspec(thread) переменной? CS>TLS как-нибудь через регистры процессора адресуется?
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, c-smile, Вы писали:
CS>>Пока пробую выкрутиться без применения RAII ...
E>IMHO, в большинстве случаев можно забить на экономию одной ссылки.
В большинстве случаев — да. В данном случае столкнулся с тем что лучше не забивать.
Здравствуйте, c-smile, Вы писали:
CS>В большинстве случаев — да. В данном случае столкнулся с тем что лучше не забивать.
А если таки помочь компиллеру?
Ну, типа сделать так, что из контекста достаётся нужная ссылка. В начале функции создаётся контекст и вся работа по ссылке идёт в функции через него, а функцию объявить какой-нибудь fast_call, чтобы аргументы через регистры шли?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, igna, Вы писали:
C>>>Преждевременная оптимизация — sqrt(∀evil). I>>А почему корень квадратный, это что, дальнейшее развитие тезиса?
К>А это и есть преждевременная оптимизация. Человек погорячился, конкретизировал степень, вызвал вопросы и нарекания.