c++ - 类中的内存使用 - 将 double 转换为 float 并没有像预期的那样减少内存使用

标签 c++ memory-management memory-profiling

我正在初始化以下类型的数百万个类

template<class T>
struct node
{
  //some functions
private:
  T m_data_1;
  T m_data_2;
  T m_data_3;

  node* m_parent_1;
  node* m_parent_2;
  node* m_child;
}

模板的目的是使用户能够选择floatdouble精度,想法是 node<float>将占用更少的内存 (RAM)。

但是,当我从 double 切换时至 float我的程序的内存占用并没有像我预期的那样减少。我有两个问题,

  1. 编译器/操作系统是否可能为我的 float 保留了比所需空间更多的空间(或者甚至将它们存储为 double )。如果是这样,我该如何阻止这种情况发生 - 我在带有 g++ 的 64 位机器上使用 linux。

  2. 有没有一种工具可以让我确定所有不同类使用的内存量? (即某种内存分析)- 以确保内存不会在我没有想到的其他地方被 goobled。

最佳答案

如果您正在为 64 位编译,那么每个指针的大小都是 64 位。这也意味着它们可能需要与 64 位对齐。所以如果你存储 3 个 float ,它可能必须插入 4 个字节的填充。所以不是保存 12 个字节,而是只保存 8 个字节。无论指针是在结构的开头还是结尾,填充仍然存在。这是必要的,以便将连续的结构放入数组中以继续保持对齐。

此外,您的结构主要由 3 个指针组成。您节省的 8 个字节将您从一个 48 字节的对象变成了一个 40 字节的对象。这并不是一个巨大的下降。同样,如果您正在为 64 位编译。

如果您正在为 32 位编译,那么您将从 36 字节结构中节省 12 个字节,这在百分比方面更好。如果必须将 double 对齐到 8 个字节,则可能更多。

关于c++ - 类中的内存使用 - 将 double 转换为 float 并没有像预期的那样减少内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6893414/

相关文章:

memory-management - 将指针设置为 nil 以防止 Golang 中的内存泄漏

c++ - 找出内存被消耗的地方

c++ - 错误 : incomplete type 'typename' named in nested name specifier

c++ - 如何在 C++ 中使用文件指针 CURL POST 文件

java - 以编程方式计算 Java 对象占用的内存,包括它引用的对象

c++ - 清理拥有的 (!) 字符串成员时析构函数偶尔崩溃

c++ - Eclipse C++ 内容辅助,自动激活

c++ - 不匹配 ‘operator<’

ruby - 获取共享数组空间的memsize

visual-studio - Windows Phone 分析 - 解析日志失败