gpt4 book ai didi

c++ - static const的C++容器初始化列表导致栈溢出

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

我有一个 std::vector 的静态常量变量:

std::vector<std::pair<GUID, std::array<double, 13>>>

我也试过了(理论上 vector 占用的内存更少):

std::unordered_map<GUID, std::array<double, 13>, HashGUID >
std::map<GUID, std::array<double, 13>, GUIDComparer >

我在程序开始时初始化它,使用初始化列表大约有 5400 个项目。我知道这看起来有点大,但这没什么特别的。它是一种临时/中间解决方案。

但是,它一直在抛出:

0xC00000FD: Stack overflow (parameters: 0x00000000, 0x00052000).

如果我将列表保持在 4000 左右以下,它似乎可以工作,但我的完整列表 5400 就不起作用了。任何想法为什么?

编辑:

这是我的初始化方式(4000 条左右的这些行效果很好。5400+,不行):

static const std::vector<std::pair<GUID, std::array<double, 13>>> engVals={
{{0x58341899, 0x8844, 0x3333, { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}}, {11, 101, 1.50, 3.50, 225.0, 850.0, 125.0,0.55, 19, 175, 565, 1.2, 0.44}},
{{0x67633448, 0x8103, 0x3333, { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}}, {11, 102, 1.50, 3.50, 475, 1300.0, 275.0, 0.55, 19, 175, 565, 1.2, 0.44}},
{{0x94422980, 0x6497, 0x3333, { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}}, {11, 103, 1.50, 3.50, 875.0, 1600.0, 500.0, 0.55, 19, 175, 565, 1.4, 0.51}},
...
};

编辑 2忘了具体说明。我正在使用 vs2013。这段代码实际上是在编译为 dll 的库中。

我需要一个初始化列表,因为上面的初始化将由另一个应用程序生成,所以我需要一个初始化这个容器的单行方法。

最佳答案

你一直说它必须在初始化列表中,因为它是由另一个程序生成的,但这并不成立。只需让其他程序生成一个二进制文件,然后从中加载 vector 。这完全绕过了这个问题。

std::istream& operator>>(std::istream& in, std::pair<GUID, std::array<double, 13>>& var)
{return in.read((char*)&var, sizeof(var));}

std::vector<std::pair<GUID, std::array<double, 13>>> loadGUIDs()
{
std::vector<std::pair<GUID, std::array<double, 13>>> ret;
ret.reserve(5400); //or sizeof file / 120b or whatever
std::ifstream infile("GUIDs.bin");
std::istream_iterator<std::pair<GUID, std::array<double, 13>>> begin(infile),end;
ret.assign(begin,end);
return ret;
}
static const std::vector<std::pair<GUID, std::array<double, 13>>> engVals = loadGUIDs();

http://ideone.com/MrVOEe

至于对用户编辑的担忧,外部二进制文件并不比可执行文件本身更容易编辑。还有副作用,您可以单独更新它们、更快的编译时间等。

关于c++ - static const的C++容器初始化列表导致栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24768675/

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