gpt4 book ai didi

c++ - 使用 memset 初始化包含数组的结构 vector

转载 作者:行者123 更新时间:2023-11-28 05:40:58 24 4
gpt4 key购买 nike

我有以下结构

struct a {
int array[20]
int array2[45]
}

我已经创建了这个结构的 vector

vector<a> vec;

我用过这个vec。现在我想初始化(将 vector 元素中对象内的所有数组值设置为零)。我该怎么做。?

最佳答案

事实证明,这是一个比乍看起来更有趣的问题。

tl;dr:如果您使用的是 C++03 或更高版本的编译器,则无需费心。

你需要了解value initialization之间的区别和 default initialization .基本上值初始化会将所有元素设置为零,而默认初始化将使它们保持独立。如果结构的任何默认元素(递归地)具有用户定义的默认构造函数,则值和默认初始化都将调用它。

请注意,值初始化memset为零要好,因为

  • 它将调用默认构造函数
  • 它将正确地初始化 float (到 0.0)和指针(到 NULL)。虽然 memset可能在您的实现中执行此操作,但不能保证。

创建具有 n 个元素的 vector 的正常方法是调用:

std::vector<a> vec(n);

C++98

这会调用

std::vector<a>::vector(size_type count, 
const T& value = T(),
const Allocator& alloc = Allocator());

value 对象将被默认构造,您将需要以某种方式初始化元素。最好的方法是提供一个正确的值初始化值来复制。所以:

const static a azeroed;  // Because this is static, it will be value initialized
std::vector<a> vec(20,azeroed);

技术说明:C++98 标准不包含术语“值初始化”,但 azeroed 的初始化是相同的。

C++03

调用了相同的 vector 构造函数,但是从 C++03 开始​​,value 参数值初始化的(所以花园里的一切都是美好的)。

C++11

电话是

std::vector<a>::vector(size_type count);

哪个值直接初始化元素。

C++14

电话是

std::vector<a>::vector(size_type count, const Allocator& alloc = Allocator());

(基本上,他们意识到他们忘记了分配器参数)。这里有一个非常细微的区别,因为元素是通过调用 Allocator::construct 构造的,尽管默认分配器将对元素进行值初始化,但可以提供一个自定义版本,它不't(参见 this answer)。如果你这样做,你几乎肯定知道你在做什么。

结论

  • 除非你使用真正的C++98编译器,否则你不需要调用memset
  • 向 vector 构造函数提供显式值初始化值比调用 memset 更安全。
  • memset 可能无法正确初始化非整数内置值(尽管它可能会)。
  • memset 绝对 会破坏任何适当的构造函数。这是一个巨大的维护风险。如果维护程序员更改结构使其不再是 POD,代码仍将编译 - 它只会做错事。
  • 只要给结构一个合适的默认构造函数就可以说很多,然后你永远不必担心是否有任何元素被初始化,即使你有一个本地拷贝也是如此。

关于c++ - 使用 memset 初始化包含数组的结构 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37100511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com