размер памяти boost::multi_array

У меня есть boost::multi_array из 3-х измерений

 boost::multi_array<Struct, 3>* newArr = new boost::multi_array<Struct, 3>(boost::extents[x][y][z], boost::fortran_storage_order())

Есть ли метод для расчета размера newArr или я должен просто использовать

sizeof(Struct)*x*y*z ?

Будут ли они одинаковыми? (Я ожидаю, что у multi_array будет немного данных контроллера)


person Bersaelor    schedule 23.11.2014    source источник


Ответы (1)


Вы должны быть в состоянии использовать

sizeof(Struct)*x*y*z + sizeof(boost::multi_array<Struct, 3>)

Позвольте мне немного поискать, раскрывает ли документация более простой/более общий подход.

Кроме того, мне нравится просто не беспокоиться и использовать вывод, например. valgrind --tool=massif чтобы точно знать, что и где выделено. Это также дало бы соответствующие результаты, если бы вы, например.

struct Struct {
    std::string x;
    char const* my_data;
};

Вот пример вывода Massif при использовании Struct только с элементом std::string:

#include <boost/multi_array.hpp>
struct Struct {
    std::string x;
};

int main() {
    int x=300,y=400,z=400;
    boost::multi_array<Struct, 3>* newArr = new boost::multi_array<Struct, 3>(boost::extents[x][y][z], boost::fortran_storage_order());
}

Это приводит, например, к в моей системе 384 000 160 байт, именно это и будет напечатано, когда вы добавите std::cout << 300*400*400*sizeof(Struct)+sizeof(*newArr);

/tmp$ valgrind --tool=massif --detailed-freq=1 ./test
/tmp$ ms_print massif.out.32149 
--------------------------------------------------------------------------------
Command:            ./test
Massif arguments:   --detailed-freq=1
ms_print arguments: massif.out.32149
--------------------------------------------------------------------------------


    MB
366.2^                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
     |                                                                       @
   0 +----------------------------------------------------------------------->Mi
     0                                                                   1.273

Number of snapshots: 3
 Detailed snapshots: [0, 1, 2]

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
  0              0                0                0             0            0
00.00% (0B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
  1      1,332,810              168              160             8            0
95.24% (160B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->95.24% (160B) 0x400ADA: main (test.cpp:8)

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
  2      1,334,836      384,004,208      384,000,160         4,048            0
100.00% (384,000,160B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->100.00% (384,000,000B) 0x401722: __gnu_cxx::new_allocator<Struct>::allocate(unsigned long, void const*) (new_allocator.h:94)
| ->100.00% (384,000,000B) 0x40138D: boost::multi_array<Struct, 3ul, std::allocator<Struct> >::allocate_space() (multi_array.hpp:474)
|   ->100.00% (384,000,000B) 0x400E52: boost::multi_array<Struct, 3ul, std::allocator<Struct> >::multi_array(boost::detail::multi_array::extent_gen<3ul> const&, boost::general_storage_order<3ul> const&) (multi_array.hpp:195)
|     ->100.00% (384,000,000B) 0x400AEB: main (test.cpp:8)
|       
->00.00% (160B) in 1+ places, all below ms_print's threshold (01.00%)
person sehe    schedule 23.11.2014
comment
Вау, впечатляющий ответ, я бы дважды проголосовал за вас, если бы мог. Также очень полезно для всех других видов объектов, размер которых вам может понадобиться :) - person Bersaelor; 23.11.2014