]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add memory_consumption() for std_cxx11::array objects.
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Sun, 3 Apr 2016 15:05:27 +0000 (10:05 -0500)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Mon, 4 Apr 2016 02:19:27 +0000 (21:19 -0500)
include/deal.II/base/memory_consumption.h

index 58e3aba37bb0fe25d91b4fbabde68a8a2b606ce2..d59a50fd81630b1f3424bdbfa3ef47d0b111f845 100644 (file)
@@ -21,6 +21,7 @@
 #include <deal.II/base/std_cxx11/shared_ptr.h>
 #include <deal.II/base/std_cxx11/type_traits.h>
 #include <deal.II/base/std_cxx11/unique_ptr.h>
+#include <deal.II/base/std_cxx11/array.h>
 
 #include <string>
 #include <complex>
@@ -145,7 +146,7 @@ namespace MemoryConsumption
 
   /**
    * Determine the amount of memory in bytes consumed by a
-   * <tt>std::vector</tt> of elements of type <tt>T</tt> by recursively
+   * <tt>std::vector</tt> of elements of type <tt>T</tt> by
    * calling memory_consumption() for each entry.
    *
    * This function loops over all entries of the vector and determines their
@@ -174,6 +175,30 @@ namespace MemoryConsumption
   inline
   std::size_t memory_consumption (const std::vector<T> &v);
 
+  /**
+   * Determine the amount of memory in bytes consumed by a
+   * <tt>std_cxx11::array</tt> of <tt>N</tt> elements of type <tt>T</tt> by
+   * calling memory_consumption() for each entry.
+   *
+   * This function loops over all entries of the array and determines their
+   * sizes using memory_consumption() for each <tt>v[i]</tt>. If the entries
+   * are of constant size, there might be another global function
+   * memory_consumption() for this data type or if there is a member function
+   * of that class of that names that returns a constant value and the
+   * compiler will unroll this loop so that the operation is fast. If the size
+   * of the data elements is variable, for example if they do memory
+   * allocation themselves, then the operation will necessarily be more
+   * expensive.
+   *
+   * Using the algorithm, in particular the loop over all elements, it is
+   * possible to also compute the memory consumption of arrays of vectors,
+   * arrays of strings, etc, where the individual elements may have vastly
+   * different sizes.
+   */
+  template <typename T, int N>
+  inline
+  std::size_t memory_consumption (const std_cxx11::array<T,N> &v);
+
   /**
    * Estimate the amount of memory (in bytes) occupied by a C-style array.
    * Since in this library we do not usually store simple data elements like
@@ -316,6 +341,25 @@ namespace MemoryConsumption
 
 
 
+  template <typename T, std::size_t N>
+  std::size_t memory_consumption (const std_cxx11::array<T,N> &v)
+  {
+    // shortcut for types that do not allocate memory themselves
+    if (std_cxx11::is_fundamental<T>::value || std_cxx11::is_pointer<T>::value)
+      {
+        return sizeof(v);
+      }
+    else
+      {
+        std::size_t mem = 0;
+        for (std::size_t i=0; i<N; ++i)
+          mem += memory_consumption(v[i]);
+        return mem;
+      }
+  }
+
+
+
   template <typename T, int N>
   std::size_t memory_consumption (const T (&v)[N])
   {

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.