结构体构造函数会占用结构体空间吗?

5
大部分时间我使用struct来保存套接字通信数据结构的所有参数,这样我就可以轻松地复制、传递或通过只传递起始地址和大小来将整个结构放到套接字上。
如果我为一个变量短数组添加了一个构造函数,那么构造函数会占用结构体内部的任何空间吗?另外,我是否可以像没有构造函数的struct一样处理带有构造函数的struct,并通过其起始地址和大小将整个struct复制到套接字上,而其空间仍然是连续分配的呢?

请注意,通过网络复制整个结构体的方式是脆弱的,如果相互通信的程序没有完全相同的填充、字节序和值大小,则会出现错误。(如果您想在不同架构之间进行通信,甚至在同一架构但使用不同编译器设置或不同编译器版本的程序实例之间进行通信,这是需要注意的问题) - Jeremy Friesner
2个回答

8
不,非虚拟成员函数不会为你的对象的 sizeof 做出贡献。至少存在一个虚拟函数的存在(但构造函数不能是虚拟的)是有贡献的,因为编译器通常通过指向一组指针函数的指针(vtable)来实现它们,所以必须存储该指针(通常为4或8个字节)。

更准确地说,拥有一个或多个虚函数是有贡献的,而函数本身并没有。 - user207421
在多重继承的情况下,你甚至可以拥有更多。 - Philip Stuyck
@PhilipStuyck 当然可以,我考虑的是最简单的情况,即没有继承。 - vsoftco

1
这个问题涉及到C++对象模型。普通函数不会增加数据大小。但是,如果我们添加虚函数,编译器将生成__vptr指向虚函数表,这将增加结构体的数据大小。
例如,我有一个a.C
#include <iostream>
using namespace std;
struct X
{
    X(){}
    int i;
    int j;

};

int main()
{
    X x;
    cout << sizeof(x) << endl;
}

这里,我在我的机器上使用IBM XL C++编译器进行编译和运行:

xlC -+ a.C
./a.out

输出将是8,这与结构体仅有int i和int j相同。
但如果我添加两个虚函数:
#include <iostream>
using namespace std;
struct X
{
    X(){}
    int i;
    int j;
    virtual void foo(){}
    virtual void bar(){}
};

int main()
{
    X x;
    cout << sizeof(x) << endl;
}

如果重新编译并运行它:
xlC -+ a.c
./a.out

输出将为16。两个int为8,__vptr也为8(我的机器是64位)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接