最近,我发现在ibm i上调整std::vector
大小的奇怪行为。
因此,当您定义
std::vector<std::string> vec;
vec.max_size();
的系统回报约为8700万
但是,当我这样做时:
vec.reserve(400000);
甚至更多失败,没有内存异常
以及相应的查询:Signal SIGABRT raised (abnormal termination).
我终于弄清楚300k是某种字符串向量的阈值,可以运行代码。
这是日志:
Procedure: _CXX_PEP__Fv
TESTPGM TESTLIB 7 CALLER 0000000000000036 TESTPGM QTEMP Н
Procedure: main
TESTPGM TESTLIB 4 CALLER 0000000000000036 TESTPGM QTEMP Н
Procedure: reserve__Q2_3std6vectorXTQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__TQ2_3std9allo
torXTQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc____FUi
TESTPGM TESTLIB 1 CALLER 0000000000000036 TESTPGM QTEMP Н
Procedure: allocate__Q2_3std9allocatorXTQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc___FUiPCv
TESTPGM TESTLIB 1 CALLER 0000000000000036 TESTPGM QTEMP Н
Procedure: _Allocate__3stdHQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc___UiPQ2_3std12basic_str
gXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc___PQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__
QYPPRT370 QSYS 12 CALLER 0000000000000036 NWSCTODF37 QBUILDSS1 Н
Procedure: __nw__FUi
QYPPRT370 QSYS 2 CALLER 0000000000000036 NOMEMORY37 QBUILDSS1 Н
Procedure: _Nomemory__3stdFv
QYPPRT370 QSYS 11 CALLER 0000000000000036 THROW37 QBUILDSS1 Н
Procedure: __Throw
QYPPRT370 QSYS 24 CALLER 0000000000000036 DOTHROW37 QBUILDSS1 Н
Procedure: __DoThrow
QYPPRT370 QSYS 16 CALLER 0000000000000036 EXCEPTIO37 QBUILDSS1 Н
Procedure: terminate__3stdFv
QYPPRT370 QSYS 1 CALLER 0000000000000036 EXCEPTIO37 QBUILDSS1 Н
Procedure: myabort__3stdFv
QC2UTIL1 QSYS 2 CALLER 0000000000000036 QC2TERM QBUILDSS1 Н
Procedure: abort
QC2UTIL1 QSYS 6 CALLER 0000000000000036 QC2SIGNL QBUILDSS1 Н
Procedure: raise
QMHPDEH QSYS 012E *DFTACTGRP 0000000000000001 Н
QMHUNMSG QSYS 0196 *DFTACTGRP 0000000000000001 Н
QMHAPD QSYS 02EC *DFTACTGRP 0000000000000001 Н
为此作业设置了CPUTIME *NOMAX
和MAXTMPSTG *NOMAX
。
所以,我想知道ibm是否限制我30万个元素向量,或者我搞砸了某个地方。
还是出于某种原因,ibm强迫我使用向量的向量?
如果有问题,我正在使用i OS 7.3 TR5
答案 0 :(得分:3)
vactor::max_size()
只会为您提供理论价值。
是否可以为许多元素分配内存,将取决于运行时可用的实际内存。
答案 1 :(得分:1)
我尝试了以下程序:
#include <vector>
#include <string>
int main(void)
{
int i;
std::vector<std::string> * vec;
i = vec->max_size();
vec = new std::vector<std::string>;
vec->reserve(i);
delete vec;
return 0;
}
I compiled as follows:
CRTCPPMOD MODULE(TEST) DBGVIEW(*ALL) TERASPACE(*YES *TSIFC) STGMDL(*TERASPACE)
DTAMDL(*LLP64) RTBND(*LLP64)
CRTPGM PGM(TEST) STGMDL(*TERASPACE)
这表明max_size返回178,956,970,比您看到的值大得多。
但是,将其传递给reserve()会导致失败并杀死工作!
我能够成功地将89000000传递给reserve(),(但是用字符串填充向量可能会导致崩溃!)
我不确定所有的细节,但是我怀疑这很大程度上与堆的非Teraspace实现(将连续存储限制为大约16MB)和Teraspace(限制为4GB连续可寻址分配)有关。您可以使用我指定的选项来查看会发生什么。
注意,我在堆中分配了向量。对于堆栈或静态分配的向量,情况可能有所不同。