用于长(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::fill
或 std::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 位)无符号长整数?
c语言int类型占的字节数因不因机子是64位还是32位的而改变啊?