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
  • 相关阅读:
    MKMapVIew学习系列2 在地图上绘制出你运行的轨迹
    WPF SDK研究 Intro(6) WordGame1
    WPF SDK研究 Intro(3) QuickStart3
    WPF SDK研究 Layout(1) Grid
    WPF SDK研究 目录 前言
    WPF SDK研究 Intro(7) WordGame2
    WPF SDK研究 Layout(2) GridComplex
    对vs2005创建的WPF模板分析
    WPF SDK研究 Intro(4) QuickStart4
    《Programming WPF》翻译 第6章 资源
  • 原文地址:https://www.cnblogs.com/tp1226/p/14146713.html
Copyright © 2011-2022 走看看