Tom*_*Tom 1 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;
}
Run Code Online (Sandbox Code Playgroud)
模板的目的是使用户能够选择float或double精确,其想法是by node<float>将占用更少的内存(RAM).
但是,当我切换double到float我的程序的内存占用时,并没有像我期望的那样减少.我有两个问题,
是否有可能编译器/操作系统保留的空间超过了我的浮动所需的空间(甚至可以将它们存储为双精度).如果是这样,我该如何阻止这种情况发生 - 我在使用g ++的64位机器上使用linux.
有没有一个工具可以让我确定所有不同类使用的内存量?(即某种内存分析) - 确保内存不会被我想到的其他地方搞砸.
如果要编译64位,则每个指针的大小为64位.这也意味着它们可能需要与64位对齐.因此,如果存储3个浮点数,则可能必须插入4个字节的填充.因此,不是保存12个字节,而是只保存8.无论指针位于结构的开头还是结尾,填充仍然存在.为了将连续的结构放在数组中以继续保持对齐,这是必要的.
此外,您的结构主要由3个指针组成.保存的8个字节将您从48字节对象转移到40字节对象.这并不是一个大幅下降.再次,如果您正在编译64位.
如果您正在编译32位,那么您将从36字节结构中保存12个字节,这在百分比方面更好.如果双精度必须与8个字节对齐,则可能更多.