首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数对象的内存结构?

函数对象的内存结构?
EN

Stack Overflow用户
提问于 2010-07-30 15:32:52
回答 7查看 1K关注 0票数 8

假设我们有一个类似这样的类:

代码语言:javascript
复制
class A 
{ 
    public:
        int FuncA( int x );
        int FuncB( int y );

        int a;
        int b;
};

现在,我知道这个类的对象将用两个ints部署在内存中。也就是说,如果我为类A的实例生成一个向量,那么一个实例将有两个ints,然后第二个实例将有两个ints,这些对象都是ints

但假设这堂课是这样的:

代码语言:javascript
复制
class B
{ 
    public:
        int FuncA( int x );
        int FuncB( int y );
};

这个类的对象在内存中是什么样子的?如果我用B的实例填充向量.矢量里有什么?我被告知,非虚拟成员函数最终被编译为与声明它们的类的实例完全无关的空闲函数(虚拟函数也是,但是对象存储一个带有函数指针的vtable )。访问限制仅仅是在语义层面,“人”层面。只有类的数据成员(和vtable等)实际上构成了对象的记忆结构。

那么,B类的对象在内存中是什么样子的呢?是某种占位符值吗?一定有东西在那里,我可以记下物体的地址。它必须指向某些东西。不管是什么,编译器是否允许内联/优化这些对象,并将方法调用视为普通的免费函数调用?如果我创建了一个向量,并在每个对象上调用相同的方法,编译器可以消除这个向量并用一堆普通的调用来替换它吗?

我只是好奇。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-07-30 15:36:43

C++中的所有对象都保证具有相当大的>= 1,以便每个对象都有一个唯一的地址。

我还没有试过,但我猜想在您的示例中,编译器将为数组/向量中的每个函数对象分配而不是初始化一个字节。

票数 7
EN

Stack Overflow用户

发布于 2010-07-30 15:43:25

正如费鲁乔所说,C++中的所有对象都保证其大小至少为1。大多数情况下,它可能只有1字节,但填充了对齐的大小,但无论如何。

但是,当用作基类时,它不需要填充任何空格,以便:

代码语言:javascript
复制
class A  {} a;    // a is 1 byte.
class B  {} b;    // b is 1 byte.
class C  { A a; B b;} c; // c is 2 bytes.
class D : public A, B { } d;  // d is 1 byte.
class E : public A, B { char ee; } e;  // e is only 1 byte
票数 6
EN

Stack Overflow用户

发布于 2010-07-30 15:37:30

这个类的对象在内存中是什么样子的?

这完全取决于编译器。一个空类的实例必须具有非零大小,这样不同的对象就有不同的地址(除非它被实例化为另一个类的基类,在这种情况下它根本不占用空间)。通常,它将由一个未初始化的字节组成。

不管是什么,编译器是否允许内联/优化这些对象,并将方法调用视为普通的免费函数调用?

是的;编译器不需要创建对象,除非您执行类似于获取其地址的操作。标准库中经常使用空函数对象,因此它们不引入任何不必要的开销是很重要的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3373017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档