一段这样的代码,考虑2种布局方式
#include <stdio.h> class Base { public: int b1, b2; virtual void test1 (void) = 0; virtual void test2 (void) = 0; virtual void test3 (void) = 0; }; class A : public Base { public: int a1, a2; void test1 (void) {printf ("test1\n");} void test2 (void) {printf ("test2\n");} void test3 (void) {printf ("test3\n");} }; A a; int main (void) { return 0; } /* // mode-1: +--+ +--+ | pointer --+-->| A::test1 --+--> +--+ +--+ | b1 | | A::test2 --+--> +--+ +--+ | b2 | | A::test3 --+--> +--+ +--+ | a1 | +--+ | a2 | +--+ // mode-2 +--+ | b1 | +--+ | b2 | +--+ | A::test1 --+--> +--+ | A::test2 --+--> +--+ | A::test3 --+--> +--+ | a1 | +--+ | a2 | +--+ */
用gcc看了一下,内存布局大致是mode-1的样子;在定义多个A的实例时,可以节省内存。
现在考虑的问题是,内存布局能不能弄成mode-2的样子?觉得可以提高访问速度(cache,局部性……..),当然假如实例多的话,内存占用肯定要多一些。
有没有编译器选项,能生成mode-2的布局模式?
谢谢!
解决方案
5
了解下虚函数原理,第二种布局没法实现多态,不可能的
5
属于得不偿失的那种,这样会导致正常的成员cache命中率降低
5
没有
1、提高访问速度,只是少了一条汇编指令,加上编译器的优化,可以完全忽略这个影响
2、局部性?函数是没有状态的,何来局部性一说,不同的实例调用的成员函数是同一个
3、内存占用肯定要多一些,不止一些,就你的这个例子,一个对象要多花掉一倍的内存
1、提高访问速度,只是少了一条汇编指令,加上编译器的优化,可以完全忽略这个影响
2、局部性?函数是没有状态的,何来局部性一说,不同的实例调用的成员函数是同一个
3、内存占用肯定要多一些,不止一些,就你的这个例子,一个对象要多花掉一倍的内存
5
接近一倍的内存
5
无意义
5
// mode-1: 虚函数个数,不影响内存占用,每个对象只是增加一个函数表指针
每个类,只需要一份虚函数表
// mode-2 有多少内存也不够用啊,这太败家了
定义一个虚函数,就要有一个指针
假设定义一百个虚函数,那就是100个指针
这种对象不要许多,栈内存,就不够用了
每个类,只需要一份虚函数表
// mode-2 有多少内存也不够用啊,这太败家了
定义一个虚函数,就要有一个指针
假设定义一百个虚函数,那就是100个指针
这种对象不要许多,栈内存,就不够用了
10
不需要考虑局部性
原因是,静态内存,一样可以加载到cache,活动页面
局部性本身,并没啥用途
局部性的用途不过是提高cache,以及页表命中率而已
全部虚函数表都在静态内存区
本身就是命中率非常高
原因是,静态内存,一样可以加载到cache,活动页面
局部性本身,并没啥用途
局部性的用途不过是提高cache,以及页表命中率而已
全部虚函数表都在静态内存区
本身就是命中率非常高