一长串大结构:更喜欢堆或堆栈分配?

时间:2015-07-03 15:01:05

标签: c++ arrays struct

我有一个包含大量数据的结构:

<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>GoogleMap</title>
<style type="text/css"> v\:* { behavior:url(#default#VML); } </style>
<script src="http://maps.google.com/maps/api/js?key=xxxxxxxxxxxxxx&sensor=false" type="text/javascript"></script>
<script type="text/javascript">

  //======== Local Google API data ===========================================================
  var map                           = null;
  var overlayvew                    = null;
  var geocoder                      = null;  
  // ======== Local controls ======================================================
  var body_info_label               = null ;
  var body_map                      = null ; 


  //======== Local functions and Events ============================================
  function load() 
  {
    body_info_label = document.getElementById("body_info_label");
    body_map        = document.getElementById("body_map")       ; 
    MapLoad(900,700,"H") ;
   }

  function MapLoad(Width,Height,MapType) 
  {
    try 
    {
      ToGM_SetMapSize(Width,Height) ;
      var mapOptions = 
        {
          center: new google.maps.LatLng(-25.363882, 131.044922),
          zoom: 4,
          mapTypeId: google.maps.MapTypeId.ROADMAP,
          // Add controls
          mapTypeControl: false, scaleControl: true, streetViewControl:false, 
          overviewMapControl: false, overviewMapControlOptions: { opened: true }
        };
      map = new google.maps.Map(body_map,mapOptions);
    } 
    catch (ex){ window.external.FromGM_Uninitialized() ; }
    if (map != null)
    { 
      geocoder = new google.maps.Geocoder();  
      ToGM_SetMapCenter(50.0,15.0,4); // Center and Zoom to Europe 
      ToGM_SetZoomControl (true   ) ; // Create and Display zoom
      ToGM_SetMapType     (MapType) ; // Display according to map Type
      ToGM_SetScaleControl(true   ) ; // Create and Display scale
      overlayview = new google.maps.OverlayView();
      overlayview.draw = function() {};
      overlayview.setMap(map);
      // call to a C# procedure to indicate end of init
      // window.external.FromGM_Initialized() ; 
     }
  }



  //======== Some functions that may be called from C# by .Net WebBrowser ================================

  function ToGM_SetMapSize(Width,Height)
  { 
    if (body_info_label!=null) Height=Height-15 ;
    body_map.style.width =Width +"px" ;
    body_map.style.height=Height+"px" ;
    if (map!=null) google.maps.event.trigger(map, 'resize'); 
  }

  function ToGM_SetMapCenter(Lat,Lon,Zoom)
  { if (map!=null) {
    if (Zoom==null) Zoom = map.getZoom() ;
    var Center ;
    if (Lat==null) Center = map.getCenter() ;
    else Center = new google.maps.LatLng(Lat,Lon);
    map.setCenter(Center) ;
    map.setZoom(Zoom);
  }}

  function ToGM_SetZoomControl(On)
  {
    if (map!=null) map.setOptions({zoomControl:On}) ;
  }

  function ToGM_SetScaleControl(On)
  {    
    if (map!=null) map.setOptions({scaleControl:On }) ; 
  }

  function ToGM_SetMapType(MapType) // String MapType = "N"/"S"/"H"/"P"
  {if (map!=null) {
    if (MapType=="N") map.setMapTypeId(google.maps.MapTypeId.ROADMAP    ); 
    if (MapType=="S") map.setMapTypeId(google.maps.MapTypeId.SATELLITE  ); 
    if (MapType=="H") map.setMapTypeId(google.maps.MapTypeId.HYBRID     ); 
    if (MapType=="P") map.setMapTypeId(google.maps.MapTypeId.TERRAIN    );
  }}

</script>
</head>

<body 
  onload="load()" onunload="unload()">
  <div id="body_map" style="width: 1000px; height: 600px"></div>
</body>
</html>

如上例所示,整个结构的大小为18944字节,假设没有填充;我需要128个,总计2424832个字节,超过2兆字节。

我需要在全局范围内声明这个数组,分配它的最佳方法是什么? 我应该执行struct myStruct { char name[128], desc[128]; struct Prm { char p_name[32]; int p_val; } parameter[512]; char Reserved[256]; }; 或将其声明为指针并在程序退出时使用myStruct myData[128];然后new[]进行初始化?或者也许是一个载体?

将它声明为堆栈的简单阵列?我如何确定它没有问题?

2 个答案:

答案 0 :(得分:3)

列表中的更好选项是std::vector<>

答案 1 :(得分:2)

大型阵列的风险正在破坏你的筹码。全局变量不在堆栈中,所以很好。