C ++ memset()用于长(64位)类型

时间:2011-10-25 17:21:16

标签: c++ memset

  

可能重复:
  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数组。

我不得不说,我通过简单地迭代数组的每个值并将其设置为所需的值来“解决”这个问题。

4 个答案:

答案 0 :(得分:6)

memset仅使用传入的值的一个字节并进行逐字节初始化。如果要初始化具有特定值的long long数组,只需使用std::fillstd::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);