struct构造函数将占用struct空间中的空间?

时间:2015-06-01 01:35:17

标签: c++ sockets struct

大多数时候我使用struct来保存套接字通信数据结构的所有参数,然后我可以通过传递起始地址及其大小轻松地复制,传递或将整个结构放在套接字上。

如果我为struct的变量短数组添加构造函数,构造函数是否会占用结构中的任何空格?或者我可以在没有构造函数的情况下使用与struct相同的构造函数处理struct,并将整个struct复制到套接字及其起始地址及其大小及其空间还在继续分配?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

这个问题与C ++对象模型有关。正常功能不会增加数据大小。但是,如果我们添加虚函数,编译器将生成__vptr指向虚函数表,这会增加struct的数据大小。

例如,我有一个.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

两个int的输出为16. 8,__ vptr的输出为8(我的机器是64位)。