首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >长(64位)类型的C++ memset()

长(64位)类型的C++ memset()
EN

Stack Overflow用户
提问于 2011-10-25 17:21:16
回答 4查看 12.1K关注 0票数 2

可能重复:

Is there memset() that accepts integers larger than char?

从memset的声明中可以看出:

代码语言:javascript
运行
复制
void * memset ( void * ptr, int value, size_t num );

是否有任何方法使用此memset函数(或STL库中包含的另一个函数),以便将内存设置为类型值?

我用它来初始化一个长长的数组,这个数组的值很大。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-25 17:59:28

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2011-10-25 17:42:30

在我看来,使用memcpy很慢,编译器中支持本机64位整数,在这种情况下,如果您在发布模式下编译,这个函数直接使用int64应该更有效。但是,考虑到现在编写的这个函数只支持8的倍数,如果您需要处理任意类型的字节数,则需要处理小端大端问题。

代码语言:javascript
运行
复制
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++的方法。

代码语言:javascript
运行
复制
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

票数 3
EN

Stack Overflow用户

发布于 2011-10-25 17:24:14

memset只使用最低的8位“value”--它的意思是将单个值复制到每个内存位置。它不尝试或试图处理多字节值,这可能会带来问题与endianness等。

如果你想用长值来填充记忆,我可能会好奇你为什么要这么做--也许还有更好的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7893217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档