用于长(64位)类型的C ++ memset()[重复]

Posted

技术标签:

【中文标题】用于长(64位)类型的C ++ memset()[重复]【英文标题】:C++ memset() for long (64bit) types [duplicate] 【发布时间】:2011-10-25 17:21:16 【问题描述】:

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

我不得不说我已经“解决”了这个问题,只需遍历数组的每个值并将其设置为所需的值。

【问题讨论】:

***.com/questions/108866/… 一般memset()用于将一块内存的值初始化为一个固定值(一次一个字节)。如果您想要设置 long long 值,您可以通过强制转换轻松地做到这一点(安全取决于您如何做)(除非您有一些未对齐的访问问题)。 【参考方案1】:

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

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

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

【讨论】:

+1 用于填充数组的 C++ 方式。 如果你想初始化一个很大的值以用作“无穷大”,像 memset(ptr, 0x7f, size) 这样的东西应该可以工作。 0x7f7f7f7f7f7f7f7fLL 相当大。【参考方案2】:

使用 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;

如cmets中所说,还有std:fill这个函数

【讨论】:

在 C++ 中,只需使用std:fill【参考方案3】:

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

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

【讨论】:

但是 memset 似乎可以在 4bytes int(多字节值)上工作......但似乎停止了进一步发展 根据我能找到的所有文档,无论传入什么,第二个参数都被转换为(无符号字符)。【参考方案4】:

您可以使用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);

【讨论】:

我认为 OP 想将 long long 值写入内存中的多个连续位置。

以上是关于用于长(64位)类型的C ++ memset()[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 64 位 Perl 中解压缩(64 位)无符号长整数?

对于intptr_t和uintptr_t的理解

c语言int类型占的字节数因不因机子是64位还是32位的而改变啊?

数据类型

64 位计算机如何处理长整数?如何确定对象的大小? [关闭]

我在 64 位机器上优化 memset 的尝试比标准实现需要更多时间。有人可以解释为啥吗?