Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::vector的最大容量<;标准::字符串>;关于ibmi_C++_Ibm Midrange_Stdvector - Fatal编程技术网

C++ std::vector的最大容量<;标准::字符串>;关于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

最近,我在IBMi上发现了调整
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的事情。我会试试看,似乎这是运行时错误的根本原因