С++ memset() для длинных (64-битных) типов

Возможный дубликат:
есть memset(), который принимает целые числа больше, чем char?

Как видно из объявления memset:

void * memset ( void * ptr, int value, size_t num );

Есть ли способ использовать эту функцию memset (или другую функцию, включенную в библиотеку STL), чтобы вы могли установить для памяти значение типа long long?

Я использую это для инициализации массива длинных длин с большим значением.

Я должен сказать, что я «решил» эту проблему, просто перебирая каждое значение массива и устанавливая его на желаемое значение.


person XCS    schedule 25.10.2011    source источник
comment
stackoverflow .com/questions/108866/   -  person Necrolis    schedule 25.10.2011
comment
Обычно memset() используется для инициализации значений блока памяти фиксированным значением (по одному байту за раз). Если у вас есть значение long long, которое вы хотите установить, вы можете легко сделать это (безопасность зависит от того, КАК вы это делаете) с помощью приведения (если у вас нет проблем с невыровненным доступом).   -  person Chad    schedule 25.10.2011


Ответы (4)


memset использует только один байт переданного значения и выполняет побайтовую инициализацию. Если вы хотите инициализировать массив long long с определенным значением, просто используйте std::fill или std::fill_n и позвольте вашей библиотеке и компилятору оптимизировать его, как они могут (развертывание частичного цикла и т. д.).

Другой канонический способ C++ — просто использовать vector и позволить его конструктору сделать всю работу за вас:

std::vector<long long> foo(length_of_array, 12345678901234LL);

person Mark B    schedule 25.10.2011
comment
+1 За способ заполнения массива С++. - person Christian Rau; 25.10.2011
comment
Если вы хотите инициализировать большое значение для использования в качестве бесконечности, должно работать что-то вроде memset(ptr, 0x7f, size). 0x7f7f7f7f7f7f7f7fLL довольно большой. - person cdleonard; 25.10.2011

Использование memcpy кажется мне медленным, у вас есть поддержка собственных 64-битных целых чисел в вашем компиляторе, в этом случае эта функция должна быть более эффективной, используя непосредственно int64, если вы компилируете в режиме выпуска. Однако учтите, что эта функция в том виде, в каком она написана, теперь поддерживает только число, кратное 8. Если вам нужно работать с любым количеством байтов, вам нужно иметь дело с проблемой прямого порядка байтов.

inline void memset64(void* buffer, int64 value, size_t count)
{
    const size_t m = count / 8;
    int64* p = (int64*)buffer;
    for (size_t i = 0; i < m; ++i, ++p)
        *p = value;
}

Но мы же на C++, верно? Давайте использовать что-то более ориентированное на C++.

template <typename T>
inline void fillarray(T* buffer, const T& value, size_t count)
{
    for (int i = 0; i < count; ++i)
        buffer[i] = value;
}

Как было отмечено в комментариях, также есть функция std:fill

person Salvatore Previti    schedule 25.10.2011
comment
В C++ просто используется std:fill. - person Stephen Canon; 09.11.2011

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

Если вы хотите заполнить память длинным длинным значением, мне, вероятно, будет любопытно, почему вы хотите это сделать - возможно, есть лучший способ.

person Joe    schedule 25.10.2011
comment
Но memset, кажется, работает с 4 байтами int (многобайтовое значение) ... но, похоже, перестает идти дальше - person XCS; 25.10.2011
comment
Согласно всем документам, которые я могу найти, этот 2-й параметр приводится к (беззнаковому символу) независимо от того, что передается. - person Joe; 25.10.2011

Для этого можно использовать функцию memcpy. Предполагая, что ваш тип long long равен 8 байтам, вы можете сделать что-то вроде:

long long mylonglong=...;
char memory[8];

// Copy the value of a long long into a character array
memcpy(memory,&mylonglong,8);
person Michael Goldshteyn    schedule 25.10.2011
comment
Я думаю, что OP хочет записать значение long long в несколько последовательных мест в памяти. - person Fred Foo; 25.10.2011