C ++: использовать memset или конструктор структуры?Какой самый быстрый? - PullRequest
7 голосов
/ 21 июня 2011

Мне трудно понять, что лучше в C ++:

Я использую структуру для управления клиентами в очереди сообщений, структура выглядит следующим образом:

typedef struct _MsgClient {
  int handle;
  int message_class;
  void *callback;
  void *private_data;
  int priority;
} MsgClient;

Все это сущности POD.

Теперь у меня есть массив этих структур, где я храню своих клиентов (я использую массив для ограничений памяти, я должен ограничивать фрагментацию). Так что в моем классе у меня есть что-то вроде этого:

class Foo
{
private:
  MsgClient _clients[32]; 

public:
  Foo()
  {
     memset(_clients, 0x0, sizeof(_clients));
  }

}

Теперь я прочитал кое-что на SO, что использование memset плохо в C ++, и что я бы лучше использовал конструктор для моей структуры. Я понял что-то вроде этого:

typedef struct _MsgClient {
  int handle;
  int message_class;
  void *callback;
  void *private_data;
  int priority;
  // struct constructor
  _MsgClient(): handle(0), message_class(0), callback(NULL), private_data(NULL), priority(0) {};
} MsgClient;

... устранит необходимость в memset. Но я боюсь, что при инициализации foo конструктор структуры будет вызываться 32 раза, вместо того, чтобы оптимизировать его как простой ноль из памяти, занятой массивом.

Каково ваше мнение по этому поводу?
Я только что нашел это: Может ли структура члена иметь нулевую инициализацию из списка инициализатора конструктора без вызова memset? , уместно ли это в моем случае (что отличается: у меня есть массив, а не один экземпляр структура)?
Кроме того, согласно этой записи , добавление конструктора в мою структуру автоматически преобразует его в структуру без POD, правильно?

Ответы [ 2 ]

12 голосов
/ 21 июня 2011

В соответствующей реализации вполне допустимо value-initialize массив в списке инициализатора конструктора с пустым инициализатором члена. Для ваших элементов массива это будет иметь эффект инициализации нулями членов каждого элемента массива.

Компилятор должен быть в состоянии сделать это очень эффективным, и вам не нужно добавлять конструктор к вашему struct.

1010 * Е.Г. *

Foo() : _clients() {}
3 голосов
/ 21 июня 2011

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

Использование memset звучит несколько быстрее, чем инициализация на объект. Однако есть вероятность, что компилятор сгенерирует тот же код.

...