可能重复:
Is there memset() that accepts integers larger than char?
在memset的声明中可以看到:
void * memset ( void * ptr, int value, size_t num );
有没有办法使用这个memset函数(或STL库中包含的其他函数),以便您可以将内存设置为 long long 类型值?
我使用它来初始化一个具有较大值的long long数组。
我不得不说,我通过简单地迭代数组的每个值并将其设置为所需的值来“解决”这个问题。
答案 0 :(得分:6)
memset
仅使用传入的值的一个字节并进行逐字节初始化。如果要初始化具有特定值的long long
数组,只需使用std::fill
或std::fill_n
,让您的库和编译器尽可能优化它(部分循环展开等)。
另一种规范的C ++方法是使用vector
并让它的构造函数为你工作:
std::vector<long long> foo(length_of_array, 12345678901234LL);
答案 1 :(得分:2)
使用memcpy对我来说似乎很慢,你在编译器中支持本机64位整数,在这种情况下,如果你在发布模式下编译,这个函数应该更直接使用int64。 但是,请考虑现在写入的此函数仅支持count为8的倍数。 如果你需要处理任何类型的字节数,你需要处理little-endian big-endian问题。
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
答案 2 :(得分:0)
memset仅使用“值”的最低8位 - 它意味着将单个值复制到每个内存位置。它不会尝试或尝试处理可能引入字节序等问题的多字节值。
如果你想用很长的值填充内存,我可能会好奇为什么你想这样做 - 可能有更好的方法。
答案 3 :(得分:0)
您可以使用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);