Search code examples
boostboost-multi-array

memory-size of boost::multi_array


I have a boost::multi_array of 3 dimensions

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

Is there method to calculate the size of newArr or should I just use

sizeof(Struct)*x*y*z ?

Would they be the same? (I expect the multi_array to have little bit of controller-data)


Solution

  • You should be able to use

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

    Let me search a bit whether the documentation reveals an easier/more generic approach.

    Also, I like to just not bother and use the output of e.g. valgrind --tool=massif to know exactly what is allocated where. This would then also give the relevant results if you had, e.g.

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

    Here's sample output from Massif when using a Struct with just a std::string member:

    #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());
    }
    

    This results in e.g. on my system 384,000,160 bytes, which is exactly what's printed when you add 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%)