博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于C语言结构体对齐的学习
阅读量:6500 次
发布时间:2019-06-24

本文共 687 字,大约阅读时间需要 2 分钟。

 

 

 
  1. # include <stdio.h> 
  2.  
  3. struct X 
  4.     int a; 
  5.     char b; 
  6.     int c; 
  7. }; 
  8. int main(void
  9.     printf("%d\n",sizeof(struct X)); 
  10.  
  11.     return 0; 
  12.  
  13.  
  14.  
  15. # include <stdio.h> 
  16.  
  17. struct Y 
  18.     int a; 
  19.     char b; 
  20.     int c; 
  21.     char d; 
  22. }; 
  23.  
  24. int main(void
  25.     printf("%d\n",sizeof(struct X)); 
  26.     return 0; 

 这个代码会输出什么?

a) 9,10

b)12, 12
c)12, 16

答案是C,我想,你一定知道字节对齐,是向4的倍数对齐。

  • 但是,你知道为什么要字节对齐吗?还是因为性能。因为这些东西都在内存里,如果不对齐的话,我们的编译器就要向内存一个字节一个字节的取,这样一来,struct X,就需要取9次,太浪费性能了,而如果我一次取4个字节,那么我三次就搞定了。所以,这是为了性能的原因。
  • 但是,为什么struct Y不向12 对齐,却要向16对齐,因为char d; 被加在了最后,当编译器计算一个结构体的尺寸时,是边计算,边对齐的。也就是说,编译器先看到了int,很好,4字节,然后是 char,一个字节,而后面的int又不能填上还剩的3个字节,不爽,把char b对齐成4,于是计算到d时,就是13 个字节,于是就是16啦。但是如果换一下d和c的声明位置,就是12了。

 

转自 : http://coolshell.cn/articles/5761.html 感谢酷壳博客的辛勤奉献。

转载地址:http://vrpyo.baihongyu.com/

你可能感兴趣的文章
java中什么是数据污染_静态数据成员既可以通过
查看>>
java安卓结束进程_Android应对Activity进程被杀死
查看>>
php 中set是什么_PHP 特殊方法 __set()、__get()、__isset() 与 __unset()
查看>>
php验证码安装代码_php实现的验证码小程序代码分享
查看>>
php中删除评论怎么做的,详解PHP如何实现评论回复删除功能
查看>>
macports 安装php,「macports」MacOS 中 MacPorts 安装和使用 - 金橙教程网
查看>>
php的联查,thinkPHP联表查询的示例分析
查看>>
php cgi nginx,cgi、fastcgi、php-fpm、nginx的个人理解。
查看>>
php 审计 for linux,for linux是什么意思
查看>>
matlab里面连接器是什么,Oops - an error has occurred
查看>>
matlab建立桌面图标,在ubuntu16.04上创建matlab的快捷方式(实现方法)
查看>>
matlab 识别率,【caffe-Windows】识别率批量输出——matlab实现
查看>>
MATLAB里面的mghglobal函数,Matlab讨论区 - 声振论坛 - 振动,动力学,声学,信号处理,故障诊断 - Powered by Discuz!...
查看>>
codeigniter 4 php7.0,CodeIgniter4
查看>>
php表的插入与呈现,php解析文本文件呈现在表格上
查看>>
php 开启重写模块,Apache 开启rewrite模式(重写模式)
查看>>
mac重置php,苹果笔记本电脑怎么恢复出厂设置
查看>>
smarty使用php代码,笑谈配置,使用Smarty技术_php
查看>>
oracle数据实际值限制,c# – Oracle数据库TNS密钥“数据源”的值长度超过了’128’的限制...
查看>>
oracle varchar 比较,为什么Oracle的varchar排序顺序与varchar比较的行为不匹配?
查看>>