C++ std::vector的最大容量<;标准::字符串>;关于ibmi
最近,我在IBMi上发现了调整C++ std::vector的最大容量<;标准::字符串>;关于ibmi,c++,ibm-midrange,stdvector,C++,Ibm Midrange,Stdvector,最近,我在IBMi上发现了调整std::vector大小的奇怪行为。 那么,当你定义 std::向量向量向量机 对于vec.max_size(),系统返回大约87M 然而,当我这样做时: vec.reserve(400000)或甚至更多它失败,没有内存异常 以及相应的查询:信号SIGABRT升高(异常终止)。 我终于发现300k是字符串向量的某种阈值,代码可以运行 以下是日志: Procedure: _CXX_PEP__Fv
std::vector
大小的奇怪行为。
那么,当你定义
std::向量向量向量机代码>
对于vec.max_size(),系统返回大约87M代码>
然而,当我这样做时:
vec.reserve(400000)代码>或甚至更多它失败,没有内存异常
以及相应的查询:信号SIGABRT升高(异常终止)。
我终于发现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
和maxtmpsg*NOMAX
所以,我想知道ibm是限制我使用300k元素向量,还是我把事情搞砸了
或者ibm出于某种原因强迫我使用向量的向量
我使用的是iOS7.3TR5,如果这很重要的话vactor::max_size()
将为您提供理论值
您是否能够为这些元素实际分配内存将取决于运行时可用的实际内存。vactor::max_size()
将为您提供理论值
您是否能够为这些元素实际分配内存将取决于运行时可用的实际内存。我尝试了以下程序:
#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)
#包括
#包括
内部主(空)
{
int i;
std::vector*vec;
i=vec->max_size();
vec=新的std::vector;
vec->储备(一);
删除vec;
返回0;
}
我的汇编如下:
CRTCPPMOD模块(测试)DBGVIEW(*全部)TERASPACE(*是*TSIFC)STGMDL(*TERASPACE)
DTAMDL(*LLP64)RTBND(*LLP64)
CRTPGM PGM(测试)STGMDL(*TERASPACE)
这表明max_size返回178956970,比您看到的值大得多
但是,将其传递给reserve()会导致sigabort并终止作业
但是,我成功地将89000000传递给reserve()(但是,用字符串填充向量可能会导致崩溃!)
我不确定所有的细节,但我怀疑这在很大程度上与堆的非teraspace实现(将连续存储限制在16MB左右)和teraspace有关,teraspace的限制是4GB的连续可寻址分配。您可以使用我指定的选项来查看发生了什么
注意,我在heap中分配了向量。对于堆栈或静态分配的向量,情况可能会有所不同 我尝试了以下程序:
#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)
#包括
#包括
内部主(空)
{
int i;
std::vector*vec;
i=vec->max_size();
vec=新的std::vector;
vec->储备(一);
删除vec;
返回0;
}
我的汇编如下:
CRTCPPMOD模块(测试)DBGVIEW(*全部)TERASPACE(*是*TSIFC)STGMDL(*TERASPACE)
DTAMDL(*LLP64)RTBND(*LLP64)
CRTPGM PGM(测试)STGMDL(*TERASPACE)
这表明max_size返回178956970,比您看到的值大得多
但是,将其传递给reserve()会导致sigabort并终止作业
但是,我成功地将89000000传递给reserve()(但是,用字符串填充向量可能会导致崩溃!)
我不确定所有的细节,但我怀疑这在很大程度上与堆的非teraspace实现(将连续存储限制在16MB左右)和teraspace有关,teraspace的限制是4GB的连续可寻址分配。您可以使用我指定的选项来查看发生了什么
注意,我在heap中分配了向量。对于堆栈或静态分配的向量,情况可能会有所不同 这取决于虚拟地址空间的限制。你有多少公羊?启用了吗?这取决于虚拟地址空间的限制。你有多少公羊?你启用了吗?好的,先生。在这种情况下,我可以为std::string分配额外的10M,但无法为std::vector添加甚至100K。vector占用那么多内存吗?记住vector
需要连续内存。好的,也许我应该继续使用其他容器类型(std::list
)好的,先生。在这种情况下,我可以为std::string分配额外的10M,但无法为std::vector添加甚至100K。vector占用那么多内存吗?记住vector
需要连续内存。好的,也许我应该继续使用其他容器类型(std::list
),谢谢teraspace的东西。我试试看,似乎这是运行时错误的根本原因感谢teraspace的事情。我会试试看,似乎这是运行时错误的根本原因