MS>Не знаю что говорят об этом стандарты, но практика говорит, что ни VC6, ни VC7, ни gcc 3.2.2, ни Watcom 11 таким образом не "обнулят" структуру это точно.
Дааа, серьезные доводы против. Если уж Ватком не обнулит, то точно так не стоит делать
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
MS>>Не знаю что говорят об этом стандарты, но практика говорит, что ни VC6, ни VC7, ни gcc 3.2.2, ни Watcom 11 таким образом не "обнулят" структуру это точно.
L_L>Дааа, серьезные доводы против. Если уж Ватком не обнулит, то точно так не стоит делать
В недалеком прошлом у меня был очень большой опыт дизассемблирования программ.
Программу скомпилированную Watcom 10 и VC5 отличить можно было очень легко по генерируемому коду (не в пользу VC). Так что зря Вы так про Watcom.
К сожалению в настоящее время уже нет необходимости в частом дизассемблировании, поэтому сравнить кодогенераторы Watcom 11 с VC6/7 не могу. А специально исследовать этот вопрос мне не интересно.
Re[6]: ZeroMemory vs xxx = { 0 };
От:
Аноним
Дата:
24.06.04 12:50
Оценка:
X>А что тогда для них вызывает какой-нибудь std::vector при вызове vector::vector(size_type)?
Для них ничего не вызывается, для них, например, выполняется new(ptr)T(val); но это не есть вызов конструктора для встроенных типов (потому как нет никаких конструкторов встроенных типов)
Здравствуйте, Xentrax, Вы писали:
АТ>>Тем более, что у некоторых POD-типов вообще нет никаких конструкторов.
X>А что тогда для них вызывает какой-нибудь std::vector при вызове vector::vector(size_type)?
Ничего не вызывает. 'std::vector<T>' выполняет инициализацию своих элементов значением выражения 'T()'. Для типа 'int', например, значение этого выражения равно '0'. Просто само по себе равно '0'. Никаких конструкторов тут никак не замешано.
>>> ZeroMemory — незаменимая вещь, если одна из структур наследует другую. <...> >>> После этого к расширенной таким образом структуре нельзя применять = {0}.
ПК>>Есть три варианта кошерного "обнуления":
ПК>>2) Наследовать, но "обнулять" так: ПК>>
ПК>>MyStruct s = MyStruct();
ПК>>
MS>Не знаю что говорят об этом стандарты, но практика говорит, что ни VC6, ни VC7, ни gcc 3.2.2, ни Watcom 11 таким образом не "обнулят" структуру это точно.
VC6 — не обнулит, ибо это его известный глюк. VC7 — хм.. не знаю что там, но, насколько я слышал, это вопрос установок компиляции. GCC 3.x.x — не надо врать, обнулит без вопросов (это глюк пристутсвовал в GCC 2, не не в GCC 3). Не знаю, что там в Watcom 11...
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Здравствуйте, MShura, Вы писали:
>>>> ZeroMemory — незаменимая вещь, если одна из структур наследует другую. <...> >>>> После этого к расширенной таким образом структуре нельзя применять = {0}.
ПК>>>Есть три варианта кошерного "обнуления":
ПК>>>2) Наследовать, но "обнулять" так: ПК>>>
ПК>>>MyStruct s = MyStruct();
ПК>>>
MS>>Не знаю что говорят об этом стандарты, но практика говорит, что ни VC6, ни VC7, ни gcc 3.2.2, ни Watcom 11 таким образом не "обнулят" структуру это точно.
АТ>VC6 — не обнулит, ибо это его известный глюк. VC7 — хм.. не знаю что там, но, насколько я слышал, это вопрос установок компиляции. GCC 3.x.x — не надо врать, обнулит без вопросов (это глюк пристутсвовал в GCC 2, не не в GCC 3). Не знаю, что там в Watcom 11...
Признаю свою ошибку по поводу gcc (не проверил версию, а приходится работать с разными).
Что касается VC7, то проверял на cl версии 13.10.3052 без каких-либо ключей.
> АТ>VC6 — не обнулит, ибо это его известный глюк. VC7 — хм.. не знаю что там, но, насколько я слышал, это вопрос установок компиляции. GCC 3.x.x — не надо врать, обнулит без вопросов (это глюк пристутсвовал в GCC 2, не не в GCC 3). Не знаю, что там в Watcom 11...
> Признаю свою ошибку по поводу gcc (не проверил версию, а приходится работать с разными). > Что касается VC7, то проверял на cl версии 13.10.3052 без каких-либо ключей.
Опять мимо. VC++ Toolkit 2003, на котором ты это по твоим словам проверял, так структуры обнуляет:
#include <iostream>
struct MyStruct
{
int i;
int j;
};
int main()
{
MyStruct s = MyStruct();
std::cout << s.i << ", " << s.j << std::endl;
}
C:\Prg\Microsoft\Visual C++ Toolkit 2003\bin>cl.exe -GX main.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3052 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
main.cpp
Microsoft (R) Incremental Linker Version 7.10.3052
Copyright (C) Microsoft Corporation. All rights reserved.
/out:main.exe
main.obj
C:\Prg\Microsoft\Visual C++ Toolkit 2003\bin>main
0, 0
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Шахтер:
>> ЭЭЭ, Павел. Надо в обязательном порядке ассемблер проверять. А иначе это может быть случайностью.
ПК>Проверяй
Да не, всё правильно. С оптимизацией вообще зашибись -- без лишних телодвижений.
>> Что касается VC7, то проверял на cl версии 13.10.3052 без каких-либо ключей.
ПК>Опять мимо. VC++ Toolkit 2003, на котором ты это по твоим словам проверял, так структуры обнуляет: ПК>
Вообще-то речь шла об обнулении наследуемых структур.
Попробуйте вот этот вариант программы:
#include <iostream>
struct A{
int a;
};
struct B : public A{
int b;
};
int main()
{
B b = B();
std::cout << b.a << "," << b.b << std::endl;
return 0;
}
Здравствуйте, Аноним, Вы писали:
А>Лично мне такая запись не нравится по причине названной выше и очень не нравится, что Рихтер делает также (может заметили, что у него и другие ошибки есть?). Ричард Стивенс, чей уровень намного выше Рихтера никогда не позволяет себе так обнулять структуру — только через memset() и bzero() — и я также делаю как и он.