2

可能重复:
是否有 memset() 接受大于 char 的整数?

从 memset 的声明中可以看出:

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

有没有办法使用这个 memset 函数(或 STL 库中包含的另一个函数),以便您可以将内存设置为long long类型值?

我用它来初始化一个具有大值的 long long 数组。

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

4

4 回答 4

6

memset只使用传入值的一个字节并进行字节初始化。如果您想long long使用特定值初始化数组,只需使用std::fillorstd::fill_n并让您的库和编译器尽可能优化它(部分循环展开等)。

另一种规范的 C++ 方法是使用vector并让其构造函数为您完成工作:

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

于 2011-10-25T17:59:28.033 回答
3

使用 memcpy 对我来说似乎很慢,您的编译器支持本机 64 位整数,在这种情况下,如果您在发布模式下编译,直接使用 int64 应该更有效。但是,考虑到现在编写的这个函数只支持 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

于 2011-10-25T17:42:30.130 回答
0

memset 仅使用“值”的最低 8 位 - 它旨在将单个值复制到每个内存位置。它不会尝试或尝试处理可能引入字节顺序等问题的多字节值。

如果您想用 long long 值填充内存,我可能会好奇您为什么要这样做——可能有更好的方法。

于 2011-10-25T17:24:14.177 回答
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);
于 2011-10-25T17:25:16.707 回答