惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Vercel News
Vercel News
博客园 - 司徒正美
C
Check Point Blog
G
Google Developers Blog
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
P
Proofpoint News Feed
IT之家
IT之家
B
Blog
博客园_首页
量子位
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
J
Java Code Geeks
H
Help Net Security
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
D
DataBreaches.Net
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
Google DeepMind News
Google DeepMind News

博客园 - kaikai

visual studio生成后调试启动又提示部分项目需要生成问题总结 让vc2010的项目在vc2012也能直接使用,而不必修改PlatformToolSet TFS:添加已经在项目中但不在TFS中的文件 宅电脑桌 动作游戏自定义技能探讨 TFS如何跨分支合并未签入的文件 友元接口-限制你的友元类数量 卡马克的求平方根函数代码的陷阱 [zt]调试的时候,无法设置数据断点(为灰色) [zt]关闭VS自带的提示 vs偶尔出现链接时间过长的情况的临时处理方法 vs链接小知识,/LTCG 这是一场正义的战争,伟大而又激烈! 浮点数默认精度在windows/linux上的差异 数独求解程序 阿朱~你走好 短代码.EOF串 短代码.第几天 短代码.求2点之距离
g++上c++模板与padding交互产生的陷阱
kaikai · 2009-07-23 · via 博客园 - kaikai
 

关于Padding,请看下面的代码:

#pragma pack(1)
struct A
{
         
char c;
         
int i;
};
#pragma pack()
struct A2
{
         
char c;
         
int i;
};

我们可以assert:

assert(sizeof(A) == 5);
assert(
sizeof(A2) == 8); // 假设32位编译环境

这里的padding大小我们基本都可以预测。

由于c++模板的代码生成规则,下面的代码可能不会注意到

template<typename T>
struct BT
{
         
int a;
};
#pragma pack(1)
struct B
{
         
char c;
         BT b;
};
#pragma pack()
struct B2
{
         
char c;
         BT b;
};

这时sizeof(B2)以及B2::b的偏移地址是多少?

struct BT第一次被实例化是在struct B内,且此时的pack1.于是该类的alienment也被当作1来处理

到后面的B2内,虽然pack已经恢复(为4)但balienment值仍然为1,于是sizeof(B2)==5B2::b的偏移为1而不是4

注意:在vc上,这个sizeof(B2)==8B2::b的偏移为4,仍然是我们所期望的。