Очистка массива char лучший сценарий — memset или нет?

В моем текущем коде у меня есть что-то вроде этого

while(true) //Infinite loop
{
char buff[60];
.....
....
}

Я хотел знать, что будет лучше в плане производительности.

  1. Объявление положительного символа (который будет содержать строки, содержащие перевод строки и символ новой строки) перед входом в бесконечный цикл и последующим использованием memset(buff, 0, 60); или же
  2. Держать это так, как есть. Влияет ли memset на производительность?

Замечания:

Мое требование заключается в том, что мне нужно иметь char массив полностью очищается при каждом перезапуске цикла.

3

Решение

«Так оно и есть» не дает массив, полный нулей. Но вам не нужно звонить memset тем не мение. Если вы только использовать buff внутри цикла, я думаю, что лучше держать его в рамках цикла:

while(true) //Infinite loop
{
char buff[60] = {}; // buff is full of zeros
.....
....
}
6

Другие решения

memset делает некоторую работу, поэтому она должна «влиять на производительность». Хотя, как правило, он сильно оптимизирован, потому что это обычная операция.

Вы вряд ли найдете более быстрый способ очистки массива из-за этого, и для сравнения код, который вы показали, делает не инициализировать массив вообще.

Для справки, это должно выглядеть примерно так:

char buff[60];
while (true) {
memset(buff, 0, sizeof(buff));
...

Единственное решение, которое может быть быстрее, — это найти способ остановиться в зависимости от обнуления буфера в начале каждой итерации.

2

Если вы последовательно используете его как строку стиля C:

char buff[60];
buff[0] = 0;

Это установит только первый байт, но если вы используете его как простую строку в стиле C, это все, что вам когда-либо нужно установить, чтобы сделать строку нулевой длины. Это быстрее, чем любое решение, которое заполняет весь буфер, вероятно, в 7 раз на 64-битной машине.

Если вам действительно нужен весь буфер, заполненный 0, то

char buff [60] = {};

сделаю это.

2
По вопросам рекламы [email protected]