Re[4]: ZeroMemory vs xxx = { 0 };
От: Lorenzo_LAMAS  
Дата: 24.06.04 12:01
Оценка:
MS>Не знаю что говорят об этом стандарты, но практика говорит, что ни VC6, ни VC7, ни gcc 3.2.2, ни Watcom 11 таким образом не "обнулят" структуру это точно.

Дааа, серьезные доводы против. Если уж Ватком не обнулит, то точно так не стоит делать
Of course, the code must be complete enough to compile and link.
Re[5]: ZeroMemory vs xxx = { 0 };
От: MShura  
Дата: 24.06.04 12:29
Оценка:
Здравствуйте, 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); но это не есть вызов конструктора для встроенных типов (потому как нет никаких конструкторов встроенных типов)
Re[6]: ZeroMemory vs xxx = { 0 };
От: Андрей Тарасевич Беларусь  
Дата: 24.06.04 17:07
Оценка:
Здравствуйте, Xentrax, Вы писали:

АТ>>Тем более, что у некоторых POD-типов вообще нет никаких конструкторов.


X>А что тогда для них вызывает какой-нибудь std::vector при вызове vector::vector(size_type)?


Ничего не вызывает. 'std::vector<T>' выполняет инициализацию своих элементов значением выражения 'T()'. Для типа 'int', например, значение этого выражения равно '0'. Просто само по себе равно '0'. Никаких конструкторов тут никак не замешано.
Best regards,
Андрей Тарасевич
Re[4]: ZeroMemory vs xxx = { 0 };
От: Андрей Тарасевич Беларусь  
Дата: 24.06.04 17:14
Оценка:
Здравствуйте, 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...
Best regards,
Андрей Тарасевич
Re[5]: ZeroMemory vs xxx = { 0 };
От: MShura  
Дата: 24.06.04 17:47
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Здравствуйте, 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 без каких-либо ключей.
Re[6]: ZeroMemory vs xxx = { 0 };
От: Павел Кузнецов  
Дата: 25.06.04 22:32
Оценка:
> АТ>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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[7]: ZeroMemory vs xxx = { 0 };
От: Шахтер Интернет  
Дата: 26.06.04 01:24
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ЭЭЭ, Павел. Надо в обязательном порядке ассемблер проверять. А иначе это может быть случайностью.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[8]: ZeroMemory vs xxx = { 0 };
От: Павел Кузнецов  
Дата: 26.06.04 03:29
Оценка:
Шахтер:

> ЭЭЭ, Павел. Надо в обязательном порядке ассемблер проверять. А иначе это может быть случайностью.


Проверяй

Без оптимизации:
_s$ = -8                        ; size = 8

; 11   :    MyStruct s = MyStruct();

    xor    eax, eax
    mov    DWORD PTR $T10428[ebp], eax
    mov    DWORD PTR $T10428[ebp+4], eax
    mov    ecx, DWORD PTR $T10428[ebp]
    mov    DWORD PTR _s$[ebp], ecx
    mov    edx, DWORD PTR $T10428[ebp+4]
    mov    DWORD PTR _s$[ebp+4], edx

; 12   :    std::cout << s.i << ", " << s.j << std::endl;

    push    OFFSET FLAT:?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z ; std::endl
    mov    eax, DWORD PTR _s$[ebp+4]
    push    eax
    push    OFFSET FLAT:$SG8481
    mov    ecx, DWORD PTR _s$[ebp]
    push    ecx
    mov    ecx, OFFSET FLAT:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
    call    ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z ; std::basic_ostream<char,std::char_traits<char> >::operator<<

С оптимизацией:
; 11   :    MyStruct s = MyStruct();

    xor    eax, eax

; 12   :    std::cout << s.i << ", " << s.j << std::endl;

    push    eax
    mov    ecx, eax
    push    OFFSET FLAT:??_C@_02KEGNLNML@?0?5?$AA@
    push    ecx
    mov    ecx, OFFSET FLAT:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
    call    ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z ; std::basic_ostream<char,std::char_traits<char> >::operator<<
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[9]: ZeroMemory vs xxx = { 0 };
От: Шахтер Интернет  
Дата: 26.06.04 04:04
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Шахтер:


>> ЭЭЭ, Павел. Надо в обязательном порядке ассемблер проверять. А иначе это может быть случайностью.


ПК>Проверяй


Да не, всё правильно. С оптимизацией вообще зашибись -- без лишних телодвижений.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[7]: ZeroMemory vs xxx = { 0 };
От: MShura  
Дата: 29.06.04 10:26
Оценка:
>> Что касается 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;
ПК>}
ПК>

ПК>[code]

Вообще-то речь шла об обнулении наследуемых структур.
Попробуйте вот этот вариант программы:

#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;
}
Re[2]: ZeroMemory vs xxx = { 0 };
От: VCoder http://wxbar.sf.net
Дата: 30.06.04 05:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Лично мне такая запись не нравится по причине названной выше и очень не нравится, что Рихтер делает также (может заметили, что у него и другие ошибки есть?). Ричард Стивенс, чей уровень намного выше Рихтера никогда не позволяет себе так обнулять структуру — только через memset() и bzero() — и я также делаю как и он.


А кто такой Ричард Стивенс?
С уважением,
Дмитрий.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.