gpt4 book ai didi

c++ - 在 C++ 类中内联一组非默认可构造对象

转载 作者:太空狗 更新时间:2023-10-29 21:30:29 25 4
gpt4 key购买 nike

C++ 不允许类包含不可默认构造的项目数组:

class Gordian {
public:
int member;
Gordian(int must_have_variable) : member(must_have_variable) {}
};

class Knot {
Gordian* pointer_array[8]; // Sure, this works.
Gordian inlined_array[8]; // Won't compile. Can't be initialized.
};

C++ 初学者都知道,该语言保证在构造类时初始化所有非 POD 成员。而且它不信任用户初始化构造函数中的所有内容 - 在构造函数主体甚至开始之前,必须向所有成员的构造函数提供有效参数。

总的来说,就我而言,这是个好主意,但我遇到过这样一种情况,如果我实际上可以拥有一组非默认可构造对象,那会容易得多。

显而易见的解决方案:有一个指向对象的指针数组。这对我来说不是最优的,因为我使用的是共享内存。这将迫使我从已经争用的资源(即共享内存)中进行额外分配。我希望在对象中内联数组的全部原因是减少分配次数。

在这种情况下,我愿意使用 hack,即使是丑陋的 hack,只要它有效。我正在考虑的一种可能的黑客攻击是:

class Knot {
public:
struct dummy { char padding[sizeof(Gordian)]; };
dummy inlined_array[8];
Gordian* get(int index) {
return reinterpret_cast<Gordian*>(&inlined_array[index]);
}
Knot() {
for (int x = 0; x != 8; x++) {
new (get(x)) Gordian(x*x);
}
}
};

当然,它可以编译,但我并不是一个经验丰富的 C++ 程序员。也就是说,我不可能不信任我的黑客。所以,问题:

1) 我想出的 hack 看起来可行吗?有什么问题? (我主要关心较新版本的 GCC 上的 C++0x)。

2) 有没有更好的方法在类中内联一组非默认可构造对象?

最佳答案

一方面,您可以使用数组包装器(例如 boost::array)用固定值初始化数组:

#include <boost/array.hpp>

class Gordian {
public:
int member;
Gordian(int must_have_variable) : member(must_have_variable) {}
};

namespace detail
{
boost::array<Gordian, 8> chop()
{
boost::array<Gordian, 8> t = {{0, 1, 4, 9, 16, 25, 36, 49}};
return t;
}
}

class Knot {
boost::array<Gordian, 8> array;
public:
Knot(): array(detail::chop()) {}
};

另一种可能性是 boost::optional 的数组(但会有一些大小开销):

#include <boost/optional.hpp>

class Gordian {
public:
int member;
Gordian(int must_have_variable) : member(must_have_variable) {}
};

class Knot {
boost::optional<Gordian> array[8];
public:
Knot()
{
for (int x = 0; x != 8; x++) {
array[x] = Gordian(x*x);
}
}
};

关于c++ - 在 C++ 类中内联一组非默认可构造对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2707923/

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