这是有效的初始化吗?

Is this an efficient initialization?

提问人:BENG 提问时间:8/10/2023 最后编辑:LoSBENG 更新时间:9/27/2023 访问量:125

问:

我想创建一个数学向量类,其主要数据是 .我还想编写构造函数以接收并将其初始化为数据属性。在我的代码中,我将对元素的类型和向量的大小进行模板化,但现在我将为四个整数的向量编写代码:std::arraystd::array

class MyVector {
private:
    std::array<int,4> data;

public:
    MyVector(std::array<int,4> input)
        :data{ input } {}
}

使用隐式构造函数,我可以定义一个对象,如下所示:MyVector

MyVector v({0, 1, 2, 3});

我的问题是:这种初始化是多余的吗?我是否只是为了通过它而创造一个额外的东西?std::array

编译器是否首先从列表创建,然后使用初始值设定项列表将其复制到对象中的属性?或者编译器是否只是在对象属性的内存地址中创建。如果我正在创建一个额外的,有没有一种更有效的方法可以使用符号输入 s,而无需创建复制数组的额外步骤?请记住,我想完成此操作,因为我希望 MyVector 类是模板化的,因此 的长度是可变的。input{0, 1, 2, 3}datastd::arraydatastd::arrayint{}{}

编辑: 我看到提到.这本质上是我正在做的事情的植入,还是有一些编译器快捷方式?我可以用于 s 吗?我不想使用,因为我希望 MyVector 类在自动内存上实例化,而不是在可用内存上实例化。std::initializer_liststd::initializer_liststd::arraystd::list

C++ 初始化 stdarray

评论

0赞 Igor Tandetnik 8/10/2023
通过这个简单的例子,编译器甚至足够聪明,可以完全消除(看看程序集;它只是打印一个常量)。优化器可以看穿它。MyVector
4赞 paddy 8/10/2023
传递 const 引用而不是值会更正常。这样可以保证不会有冗余副本,即使在未优化的构建中也是如此。不要害怕为可能需要的不同初始化样式提供多个构造函数。您的数据可能并不总是整齐地打包在 4 元素中。std::array
0赞 BENG 8/10/2023
哦,哇,我明白了。我低估了优化器。因此,在短时间内创建大量 MyVector 时,我不应该担心额外的复制步骤,因为优化器会摆脱它吗?
0赞 BENG 8/10/2023
@paddy我最终想为 int 和 floats 创建一个 vec2、vec3、vec4 类,这些是我将使用的主要向量。但是,为每种大小和类型创建单独的构造函数似乎确实是多余的。这就是为什么我想把它模板化,并将所有的数学函数放在模板化的类中。
1赞 nanofarad 8/10/2023
任何给定的编译器优化都取决于优化器、优化级别等。不过,这是一个相当常见的优化。至于“制作单个构造函数......似乎真的是多余的“——如果设计得当,正确使用的模板在类型名称上参数化(加上可能的 typedefs 以提供方便的别名)应该能够处理这个问题。

答: 暂无答案