c++虚函数内存布局探讨

C++语言 码拜 9年前 (2016-05-25) 1321次浏览
一段这样的代码,考虑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、内存占用肯定要多一些,不止一些,就你的这个例子,一个对象要多花掉一倍的内存

5

引用:

没有
1、提高访问速度,只是少了一条汇编指令,加上编译器的优化,可以完全忽略这个影响
2、局部性?函数是没有状态的,何来局部性一说,不同的实例调用的成员函数是同一个
3、内存占用肯定要多一些,不止一些,就你的这个例子,一个对象要多花掉一倍的内存

接近一倍的内存

5

引用:
Quote: 引用:

没有
1、提高访问速度,只是少了一条汇编指令,加上编译器的优化,可以完全忽略这个影响
2、局部性?函数是没有状态的,何来局部性一说,不同的实例调用的成员函数是同一个
3、内存占用肯定要多一些,不止一些,就你的这个例子,一个对象要多花掉一倍的内存

3 — 是的,内存占用一定是膨胀了的。
2 — 本人是指数据的局部性:对象数据 和 虚表数据,存在于内存中 不连续 的空间位置上。因此在一次虚函数调用的过程中,要访问 对象数据,也要访问虚表数据(取得函数指针),正是由于这两个部分是分开存放的,所以理解为 局部性 变差了。这也是为什么考虑mode-2模式布局的原因:干脆把它们挨着放到一起,在地址空间上连续,提高一点 数据的局部性。
1 — 说的就是这一条汇编指令:一条读指令。原因是就是在这条指令上,访问了“远处”的虚表,有可能导致某些潜在的性能损失。
:)

无意义

5

// mode-1: 虚函数个数,不影响内存占用,每个对象只是增加一个函数表指针
每个类,只需要一份虚函数表
// mode-2 有多少内存也不够用啊,这太败家了
定义一个虚函数,就要有一个指针
假设定义一百个虚函数,那就是100个指针
这种对象不要许多,栈内存,就不够用了

10

不需要考虑局部性
原因是,静态内存,一样可以加载到cache,活动页面
局部性本身,并没啥用途
局部性的用途不过是提高cache,以及页表命中率而已
全部虚函数表都在静态内存区
本身就是命中率非常高

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c++虚函数内存布局探讨
喜欢 (0)
[1034331897@qq.com]
分享 (0)