【发布时间】:2021-05-13 21:50:17
【问题描述】:
假设结构体提供了两个模板参数,一个是typename T,另一个是size_t N。现在,该结构应该存储元素类型为T 和大小为N 的静态数组。在某些情况下,在创建实例时使用默认值初始化数组可能会很好,如果你有类似的东西,我认为无论如何都会发生这种情况
template<typename T, size_t N>
struct Foo {
T values[N];
size_t size;
explicit Foo(size_t _size) : size{ _size } {}
}
所以,如前所述,我认为这种情况下的行为是values 只是自动使用默认值初始化(调用T 的默认构造函数)。但是,如果我想在构造对象时为数组传递一些值怎么办?这里的目标是我能够将一个静态数组传递给构造函数,并让该静态数组代替values。理想情况下,整个过程中只有两个数组创建。但这可能吗?考虑以下示例:
template<typename T, size_t N>
struct Foo {
T values[N];
size_t size;
explicit Foo(T _values[N], size_t _size) : values{ _values }, size{ _size} {}
}
现在,除了我什至不知道上述是否会按预期工作之外,我仍然有点不确定何时在 C++ 中发生复制。我想在最坏的情况下,调用Foo的构造函数时会创建4个数组:
- 调用
Foo的构造函数需要传入一个数组,所以需要事先创建。 - 构造函数参数
_values是传值方式,所以这里发生了拷贝。 - 在构造函数初始化任何值之前,静态数组已经初始化(?)
- 将
_values分配给values时,正在发生另一个副本 (?)
现在正如我所说,我真的不确定 C++ 中的复制行为。当然,我们可以通过使_values 参数按引用传递来排除创建一个数组。但是,静态数组 values 将在被 _values 覆盖之前被初始化,我认为是这样。
因此,我的问题是:这里最好的策略是什么?我该如何编写代码才能触发最少的数组创建?
谢谢!
编辑:
不,我不能使用 std::vector 或 stdlib 中的任何其他数据结构。即使可以,我的问题仍然是关于 原始数组 的最佳策略,而不是如何切换我的方法以支持某些包装器。
【问题讨论】:
-
除非您的任务是编写自己的数组包装类,否则只需使用
std::vector并避免所有这些混乱。 -
“结构应该存储一个静态数组”。 要么 struct 应该存储数组,要么 数组应该是静态的,两者一起没有意义。
-
不要忘记数组,因为参数是mostly lies。
-
@tadman 甚至
std::array,看起来更适合这个定义。 -
@tadman
std::array也不必在堆栈上使用,它可以用作更大堆分配的一部分。std::vector具有额外间接和堆分配开销的缺点,无论向量对象本身的存储持续时间如何。我不会说偏爱其中一个,我会说使用在特定情况下有意义的那个。