zoukankan      html  css  js  c++  java
  • Code Tips: gcc对结构体的默认字节“对齐”方式

    1. 发现问题

        最近在编写代码过程中发现,对一个结构体进行 sizeof 操作时,有时候大小是填充过的,有时候又没有填充。

        那么,如果在代码中没有显示的指定要求编译器进行对齐时,gcc的默认处理是怎样的呢?

    2. 先说结论

    •     代码中如果没有显示指定字节对齐时,gcc默认并没有进行cpu宽度字节对齐;
    •     gcc会将结构体的大小填充为结构体最大成员的整数倍(如果结构体中的成员也是一个结构体,则查看这个成员的成员)

    3. 实验

        根据实验代码,可以清晰的理解gcc对结构体的默认处理行为

     1 /*--------------------------------------
     2  * struct_size.c
     3  * author: taopeng
     4  * -------------------------------------*/
     5 
     6 #include <stdio.h>
     7 #include <stdlib.h>
     8 
     9 /* 成员最大size为1, 无须再填充*/
    10 typedef struct
    11 {
    12     char a;
    13     char b;
    14     char c;
    15 }tTestEntry1;
    16 
    17 /* 成员最大size为2,需要将大小填充为2的倍数 */
    18 typedef struct
    19 {
    20     char a;
    21     char b;
    22     char c;
    23     short d;
    24 }tTestEntry2;
    25 
    26 /* 成员最大size为4,需要将大小填充为4的倍数 */
    27 typedef struct
    28 {
    29     char a;
    30     int b;
    31 }tTestEntry3;
    32 
    33 /* 成员最大size为4,需要将大小填充为4的倍数 
    34  * 内部有结构体,继续查看内部结构体成员 */
    35 typedef struct
    36 {
    37     struct
    38     {
    39         char a;
    40         int b;
    41     }t;
    42 
    43     int c;
    44 }tTestEntry4;
    45 
    46 int main(int argc, char *argv[])
    47 {
    48     printf("sizeof(tTestEntry1)=%lu
    ", sizeof(tTestEntry1));
    49     printf("sizeof(tTestEntry2)=%lu
    ", sizeof(tTestEntry2));
    50     printf("sizeof(tTestEntry3)=%lu
    ", sizeof(tTestEntry3));
    51     printf("sizeof(tTestEntry4)=%lu
    ", sizeof(tTestEntry4));
    52 
    53     return 0;
    54 }

    输出结果:

    sizeof(tTestEntry1)=3
    sizeof(tTestEntry2)=6
    sizeof(tTestEntry3)=8
    sizeof(tTestEntry4)=12
  • 相关阅读:
    安卓Android基础—第一天
    android打电话方法(直接拨通)
    android打电话简单功能(完整代码)
    android最最基础简单的保存xml代码
    Android广播接收者笔记
    记录点点滴滴
    改变对话框和控件的背景及文本颜色
    对话框捕获WM_KEYDOWN消息
    对话框捕获鼠标移动消息,实现“逃跑按钮”
    注意!!!对话框的默认按钮、输入焦点传递
  • 原文地址:https://www.cnblogs.com/tp1226/p/14146713.html
Copyright © 2011-2022 走看看