IBM i上std :: vector <std :: string>的最大容量

时间:2018-12-21 06:26:01

标签: c++ ibm-midrange stdvector

最近,我发现在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 *NOMAXMAXTMPSTG *NOMAX

所以,我想知道ibm是否限制我30万个元素向量,或者我搞砸了某个地方。

还是出于某种原因,ibm强迫我使用向量的向量?

如果有问题,我正在使用i OS 7.3 TR5

2 个答案:

答案 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连续可寻址分配)有关。您可以使用我指定的选项来查看会发生什么。

注意,我在堆中分配了向量。对于堆栈或静态分配的向量,情况可能有所不同。