c++ - 如何在 C++ 中编码大型复杂常量数据结构

标签 c++ c++11 g++ clang

过去,我使用 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/

相关文章:

java - 使用界面在后台运行 matlab

c++ - 错误在 `./2' : free(): invalid pointer: 0x000000000096044c *** Aborted (core dumped)

c++ - MSVC (10.0/11.0) 的内联命名空间仿真

c++ - std::list 中 end() 之后的下一个迭代器

c++ - 迭代超过 10GB+ 的二进制文件

c++ - G++ 编译器对我明确定义的函数给出 "undefined reference"错误

c++ - 我可以使用哪个库来发送包含 UTF 文本和文件附件的 SMTP/MIME 电子邮件?

C++ 纯虚函数

mysql - 找不到 libmysqlclient.a

java - 需要在类似于 CertSerializeCertificateStoreElement Windows API 的 java 中生成相同的序列化值