我有一个std :: vector的静态const变量:
std::vector<std::pair<GUID, std::array<double, 13>>>
我也试过(理论上的载体占用更少的内存):
std::unordered_map<GUID, std::array<double, 13>, HashGUID >
std::map<GUID, std::array<double, 13>, GUIDComparer >
我在程序开始时初始化它,使用初始化列表列出大约5400个项目。我知道这看起来有点大,但没有什么不寻常的。它是临时/中间解决方案。
然而,它一直在抛出:
0xC00000FD:堆栈溢出(参数: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的库中。
我需要一个初始化列表,因为上面的初始化将由另一个应用程序生成,所以我需要一种初始化此容器的单行方式。
答案 0 :(得分:1)
首先尝试使用std::array
的@dyp建议。
如果它不起作用,您可以尝试以下方法。我刚刚做了一个简单的例子。
std::vector<int> CreateVector()
{
std::vector<int> temp;
temp.reserve(3);
temp.push_back(1);
temp.push_back(2);
temp.push_back(3);
return temp;
}
static const std::vector<int> data = CreateVector();
答案 1 :(得分:1)
我认为这里的问题是初始化列表本身,因为当你将构造函数调用到外部向量时,它被推入堆栈。
我建议回到普通的旧数组,使其成为静态或全局常量的文件。
struct GUI_xxx {
GUID guid;
double values[13];
};
const GUI_xxx engVal[] = {
{{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}},
...
};
您在技术上仍将使用初始化列表语法,但(假设GUID足够简单),可以将其优化为库的全局常量部分中的常量表。如果您仍然遇到类似的问题,您甚至可以尝试在单独的.c文件中将此常量创建为外部C常量。 (假设GUID是POD。)
答案 2 :(得分:1)
你一直说它必须在初始化列表中,因为它是由另一个程序生成的,但是它并不存在水。只需让其他程序生成二进制文件,然后从中加载向量。这完全绕过了问题。
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();
对于用户编辑的担忧,外部二进制文件编辑比可执行文件本身更容易。还有副作用,你可以单独更新它们,加快编译时间等。