Инициализация объекта на все нули - PullRequest
17 голосов
/ 15 мая 2010

Часто правильная инициализация структур данных состоит в том, чтобы установить все элементы в ноль. Даже при программировании на C ++ может потребоваться интерфейс с внешним API, для которого это имеет место.

Есть ли практическая разница между:

some_struct s;
memset(&s, 0, sizeof(s));

и просто

some_struct s = { 0 };

Есть ли люди, которые используют оба, с методом выбора, который больше подходит для данного приложения? (Надеюсь, понятно, что в настоящее время это применимо только к структурам POD; вы получите все виды хаоса, если в этой структуре будет C ++ std :: string.)

Для себя, в основном для программиста на C ++, который мало использует memset, я никогда не уверен сигнатуры функции, поэтому я считаю, что второй пример проще в использовании, чем меньше типизированный, более компактный и, возможно, даже более очевидный, поскольку он говорит «этот объект инициализируется нулем» прямо в объявлении, а не ожидает следующей строки кода и видит: «о, этот объект инициализируется нулями».

При создании классов и структур в C ++ я склонен использовать списки инициализации; Мне любопытны мысли о двух приведенных выше инициализациях в стиле «С», а не сравнение с тем, что доступно в C ++, поскольку я подозреваю, что многие из нас взаимодействуют с библиотеками C, даже если мы сами кодируем в основном на C ++.

Редактировать: Нил Баттерворт задал этот вопрос , в продолжение, что я считаю интересным следствием этого вопроса.

Ответы [ 12 ]

0 голосов
/ 15 мая 2010

В C я предпочитаю использовать {0,} эквивалентному memset (). Однако gcc предупреждает об этом :( Подробности здесь: http://www.pixelbeat.org/programming/gcc/auto_init.html

В C ++ они обычно эквивалентны, но, как всегда, в C ++ Есть угловые случаи для рассмотрения (отмечено в других ответах).

0 голосов
/ 15 мая 2010

Функция bzero - это еще одна опция.

#include <strings.h>
void bzero(void *s, size_t n);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...