过去,我使用 gcc 的 C99-style compound-literal extension到 C++ 以在代码中编码嵌套常量数据结构。这是一个例子:
#include <iostream>
using namespace std;
struct Tree {
const char *name;
const Tree *left;
const Tree *right;
};
const Tree *const tree = (Tree []) {
"top", // name
(Tree[]) {
"left",
0,
0
},
(Tree[]) {
"right",
0,
0
}
};
static void dump(const Tree *tree) {
if (!tree) {
cout << "null";
return;
}
cout << tree->name << "(";
dump(tree->left);
cout << ", ";
dump(tree->right);
cout << ")";
}
int main(void) {
dump(tree);
cout << "\n";
}
想法是为这些相当大的常量结构使用静态存储持续时间,初始化成本为零,并且实际上不需要将任何内容分页到内存中,除非需要。
然而,这在最新版本的 clang 中不再有效,最新的 OS X 将 clang 捆绑在名称“gcc”下。所以我需要一个不同的解决方案。
在 C++ 中最符合标准的习语是什么?
我并不是特别想支付构建这些结构中所有对象的成本,所以如果可以避免,那就太好了。
最佳答案
C++11 uniform initialization语法应该有效:
const Tree* const tree = new Tree{"top",
new Tree{"left", nullptr, nullptr},
new Tree{"right", nullptr, nullptr}
};
否则,只需创建一个将名称和子树作为参数的构造函数。
如果您不想动态分配结构,您必须自己创建每个结构,然后使用例如将它们链接在一起地址运算符:
namespace
{
const Tree leftTree{"left", nullptr, nullptr};
const Tree rightTree{"right", nullptr, nullptr};
const Tree topTree{"top", &leftTree, &rightTree};
}
const Tree* const tree = &topTree;
关于c++ - 如何在 C++ 中编码大型复杂常量数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19586323/