Является ли предпочтительным / хорошо использовать инициализацию структуры ({...}) по сравнению с memset и т. Д.? - PullRequest
9 голосов
/ 13 декабря 2010

Код:

WINDOWPLACEMENT wplcmt = {sizeof(WINDOWPLACEMENT)};

Выглядит намного чище, чем:

WINDOWPLACEMENT wplcmt;
memset(&wplcmt, 0, sizeof(WINDOWPLACEMENT));
wplcmt.length = sizeof(WINDOWPLACEMENT);

Сборочный вывод этой вещи также довольно хорош, для более длинных структур MSVC даже использует memset вместоxor eax, eax и mov х.И со стандартной точки зрения это тоже выглядит хорошо.Но я все еще боюсь пограничных случаев, когда структура не плотно упакована, скажем #pragma pack(128), и Windows внезапно решает сделать memcmp структуры.

Так хорошо / плохо использовать такой синтаксис?Это хорошая практика, чтобы использовать такие инициализации?

Ответы [ 5 ]

8 голосов
/ 13 декабря 2010

Второй код, который вы показываете,

WINDOWPLACEMENT wplcmt;
memset(&wplcmt, 0, sizeof(WINDOWPLACEMENT));
wplcmt.length = sizeof(WINDOWPLACEMENT);

, ужасен.Запутывание, неэффективность, многословие, вы все это втиснули.

Первый фрагмент кода,

WINDOWPLACEMENT wplcmt = {sizeof(WINDOWPLACEMENT)};

, кроме запутывания, является предпочтительным способом, если вы не хотите

  • тратят больше времени на написание кода,

  • читатели тратят больше времени на чтение и ненужный анализ вашего подробного кода,

  • получают менее эффективное выполнение, а

  • предоставляют порталы ввода ошибок.

Кстати, что за запутанное имя выиспользуется, wplcmt?

Почему вы запутываете имена?

Ваш вопрос реален или это просто троллинг?

Приветствия и hth.,

РЕДАКТИРОВАТЬ : вопрос был отредактирован.Вышеуказанные вопросы были в ответ на первоначальный заголовок / вопрос «Насколько зла эта структура распределения?».Я оставляю свой ответ как есть, чтобы предоставить контекст для комментариев.

РЕДАКТИРОВАТЬ 2 : контекст изменился еще больше: ник OP изменился с "Madman" на "Coder",Итак, в то время как оригинал был о «Как eveil» нормальный код от «Безумца», теперь он о «Является ли это предпочтительным ...» «Кодером».О, хорошо, я имею в виду, я не называю его «Безумцем» в комментариях, как это будет выглядеть сейчас;это то, что он называл себя своим прозвищем в то время.

7 голосов
/ 13 декабря 2010

Использовать memset.Тогда все сразу увидят, что делает код, и вряд ли у него появятся неожиданные побочные эффекты.

1 голос
/ 13 декабря 2010

С этим видом инициализации я борюсь постоянно. В C99 можно сделать:

WINDOWPLACEMENT wplcmt = {.length = sizeof(wplcmt), .showCmd = SW_SHOW};

А остальные значения инициализируются нулями.

В G ++ вы можете сделать:

WINDOWPLACEMENT wplcmt = {length: sizeof(wplcmt), showCmd: SW_SHOW};

И, наконец, в C ++ вы можете выбрать между инициализацией всех участников или надеяться, что вы получите правильный порядок элементов, например:

WINDOWPLACEMENT wplcmt = {sizeof(wplcmt)};
WINDOWPLACEMENT wplcmt = {sizeof(wplcmt), 0, SW_SHOW, {0, 0}, {0, 0}, {0, 0, 0, 0}};

На самом деле в последнем случае я даже не уверен, что все компиляторы C ++ поддерживают составную буквальную инициализацию. Кроме того, если члены изменят порядок или тип, а ваши значения по-прежнему соответствуют, вы не получите ошибку.

Лично я решу использовать C99 там, где могу, я бы объявил структуру, которую вы дали, одним ударом, со всеми известными значениями заранее, как это:

WINDOWPLACEMENT const wplcmt = {.length = sizeof(wplcmt), .showCmd = SW_SHOW};

Update0

Казалось бы, "инициализировать все", о котором я говорил, предназначено только для массивов? Моя ошибка, это делает C ++ немного более удобным для использования.

0 голосов
/ 08 апреля 2016

Если вы используете Visual Studio, я настоятельно рекомендую вам использовать:

WINDOWPLACEMENT wplcmt;
SecureZeroMemory((LPVOID)&wplcmt, sizeof(WINDOWPLACEMENT));
wplcmt.length = sizeof(WINDOWPLACEMENT);

, потому что оптимизирующий компилятор может полностью удалить вызов memset из вашего сгенерированного кода, вызывая много головной болиесли вам действительно нужно установить эти значения на ноль.

SecureZeroMemory никогда не будет удален.

0 голосов
/ 13 декабря 2010

memset должен иметь лучшую производительность, потому что обычно он написан на высокооптимизированном ассемблере

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...