可能重复:
Is there memset() that accepts integers larger than char?
从memset的声明中可以看出:
void * memset ( void * ptr, int value, size_t num );
是否有任何方法使用此memset函数(或STL库中包含的另一个函数),以便将内存设置为长类型值?
我用它来初始化一个长长的数组,这个数组的值很大。
我不得不说,我已经“解决了”这个问题,只需迭代数组的每个值,并将其设置为所需的值。
发布于 2011-10-25 17:59:28
memset
只使用传入值的一个字节,并按字节进行初始化。如果您想用特定的值初始化一个long long
数组,只需使用std::fill
或std::fill_n
,让您的库和编译器尽可能地优化它(部分循环展开等等)。
另一种规范的C++方法是只使用vector
并让它的构造函数为您完成以下工作:
std::vector<long long> foo(length_of_array, 12345678901234LL);
发布于 2011-10-25 17:42:30
在我看来,使用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
发布于 2011-10-25 17:24:14
memset只使用最低的8位“value”--它的意思是将单个值复制到每个内存位置。它不尝试或试图处理多字节值,这可能会带来问题与endianness等。
如果你想用长值来填充记忆,我可能会好奇你为什么要这么做--也许还有更好的方法。
https://stackoverflow.com/questions/7893217
复制相似问题