C++多继承中的内存布局(2)

接上文,还是先看一个例子:

struct base {
   int value = 99;
};
struct offset {
   char space[10] = "abc";
};
struct derived : offset, base {
   int dvalue = 0;
};

derived的内存布局应该是先存放offset的内容,再存放base的内容,最后存放derived自己的成员,按照4字节对齐,这个很容易验证:

如果我们添加虚函数:

struct base {
   int value = 99;
   virtual void foo() { std::cout << value << std::endl; }
   virtual void bar() { std::cout << value << std::endl; }
};
struct offset {
   char space[10] = "abc";
};
struct derived : offset, base {
   int dvalue = 0;
   virtual void foo() { std::cout << value << "," << dvalue << std::endl; }
};

这个时候便不再是先存放space的内容了,因为内存最开始的地方要存放vptr,且由于只有base有虚函数,因此可以共用这个vptr,所以在内存布局上会把base放到前面来,按8字节对齐:

且此时,在第二个block中,存放value后还剩四个字节,可以继续存放space的4个char,这个被称作"tail padding"。

验证一下:

typedef long long u64;
derived d;
base * b = &d; // This generates an offset
cout << sizeof(derived) << endl; //
cout << *((int*)((u64*)(b) + 1)) <<endl;
cout << *((int*)((u64*)(b) + 3)) <<endl;
cout << *((char*)((u64*)(b) + 1) + 4) <<endl;

按照上述分析,应该输出:32,99,0,a:

#面试##面经##笔经##C++##面试题刺客退退退#
全部评论

相关推荐

技术栈:c++,shell,TCP/UDP,docker,cmake,&nbsp;网络编程,&nbsp;系统编程项目简介:&nbsp;是一个基于&nbsp;IO多路复用&nbsp;的&nbsp;安全可靠的&nbsp;UDP&nbsp;文本传输框架。&nbsp;1.&nbsp;docker&nbsp;模块:&nbsp;使用&nbsp;docker&nbsp;构建整个&nbsp;safe-udp&nbsp;项目环境,通过&nbsp;dockerfile&nbsp;安装&nbsp;glog、cmake&nbsp;等依赖项,并使用&nbsp;Shell&nbsp;编写容器操作脚本,以实现项目构建流程的自动化和部署的便利性。2.&nbsp;UDP_Transport&nbsp;模块:&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;封装应用层&nbsp;UDP&nbsp;Data&nbsp;Segment:&nbsp;序列号、确认号、ACK、FIN等字段;并封装&nbsp;序列化/反序列化&nbsp;接口供上层调用。&nbsp;&nbsp;-&nbsp;根据&nbsp;RFC规范&nbsp;加权计算&nbsp;平滑&nbsp;RTT&nbsp;和超时重传&nbsp;RTO&nbsp;,并与&nbsp;IO多路复用(select)&nbsp;结合设置&nbsp;超时逻辑,监听客户端的响应。&nbsp;&nbsp;-&nbsp;封装&nbsp;Sliding&nbsp;Window&nbsp;和&nbsp;Buffer,跟踪和管理&nbsp;发送/接收数据&nbsp;包的缓冲区,并设置相应索引指针,处理接收到&nbsp;ACK逻辑。&nbsp;&nbsp;-&nbsp;动态调节接收/拥塞窗口大小,自适应开启&nbsp;慢启动、拥塞避免、拥塞发生、超时重传、快恢复&nbsp;功能,并计算&nbsp;cwnd、ssthresh&nbsp;的值。&nbsp;&nbsp;-&nbsp;封装统计模块,统计慢启动、拥塞避免、超时重传&nbsp;的数据包量和比率,反馈网络性能和行为,利于后续网络服务优化。&nbsp;&nbsp;-&nbsp;动态模拟&nbsp;网络丢包和时延&nbsp;状况,&nbsp;校验&nbsp;safe-udp&nbsp;的可靠性和容错性(重传机制)&nbsp;。3.&nbsp;项目管理和构建:&nbsp;使用&nbsp;cmake&nbsp;作为项目的构建系统,构建&nbsp;udp_tansport&nbsp;动态库,供第三方模块调用;并通过&nbsp;git&nbsp;,clang-format等工具,管理仓库代码。4.&nbsp;功能测试和验证模块:构建&nbsp;server、client&nbsp;测试程序,验证safe-udp&nbsp;可靠传输功能;并编写&nbsp;diff.sh&nbsp;脚本判断收发的文本内容是否完备 #项目#&nbsp;&nbsp;#简历中的项目经历要怎么写#&nbsp;&nbsp;#我的成功项目解析#&nbsp;&nbsp;#Linux#&nbsp;&nbsp;#C++后端#
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客企业服务