• __ATTRIBUTE__ 你知多少?


    _ATTRIBUTE__ 你知多少?

     1 #include "stdio.h"
     2 
     3 /* 地址参考基准 */
     4 
     5 char r1;
     6 short r2;int refer;
     7 
     8 struct p
     9 {
    10     int a;
    11 
    12     char b;
    13 
    14     short c;
    15 
    16 }__attribute__((aligned(4))) pp;
    17 /* 4字节对齐,a本身占4字节 此处占4字节,b本身占1字节 此处占2字节(补齐4字节),c本身占2字节 此处占2字节(补齐4字节)*/
    18 
    19 struct m
    20 {
    21     char a;
    22 
    23     int b;
    24 
    25     short c;
    26 
    27 }__attribute__((aligned(4))) mm;
    28 /* 4字节对齐,a本身占1字节 此处占4字节(补齐4字节),b本身占4字节 此处占4字节,c本身占2字节 此处占4字节(补齐4字节) */
    29 
    30 struct o
    31 {
    32     int a;
    33 
    34     char b;
    35 
    36     short c;
    37     
    38     char d; 
    39 
    40 }oo;
    41 /* 默认字节对齐同4字节对齐,a本身占4字节 此处占4字节,b本身占1字节 此处占2字节,c本身占2字节 此处占2字节、
    42 (b和c一起补齐占4字节,因为b是从4的整数倍地址开始放的),d本身占1字节 此处占4字节(默认字节对齐) */
    43 
    44 struct x
    45 
    46 {
    47     int a;
    48 
    49     char b;
    50 
    51     struct p px;
    52 
    53     short c;
    54 
    55 }__attribute__((aligned(8))) xx;
    56 /* 8字节对齐,a本身占4字节 此处占4字节,b本身占1字节 此处占4字节(同a一起补齐8字节因为px是8字节的要从8的整数倍地址放),
    57 px本身占8字节 此处占8字节,c本身占2字节 此处占8字节(由于8字节对齐且c是从8的整数倍地址开始放的,所以c要补齐到8字节) */
    58 
    59 int main()
    60 
    61 {
    62     /* 数据类型所占内存大小 */
    63     printf("sizeof(int)=%d, sizeof(short)=%d, sizeof(char)=%d 
    ", sizeof(int), sizeof(short), sizeof(char));
    64     /* 单个变量的地址分配 */
    65     printf("sizeof(refer)=%d, &refer=0x%08X, &r1=0x%08X,&r2=0x%08X 
    ", sizeof(refer), &refer, &r1, &r2);
    66     /* 4字节对齐的结构体地址分配 */
    67     printf("pp=%d, &pp=0x%08X, &pp.a=0x%08X, &pp.b=0x%08X, &pp.c=0x%08X 
    ", sizeof(pp), &pp, &pp.a, &pp.b, &pp.c);
    68     /* 4字节对齐的结构体地址分配 */
    69     printf("mm=%d, &mm=0x%08X, &mm.a=0x%08X, &mm.b=0x%08X, &mm.c=0x%08X 
    ", sizeof(mm), &mm, &mm.a, &mm.b, &mm.c);
    70     /* 默认字节对齐的结构体地址分配 */
    71     printf("oo=%d, &oo=0x%08X, &oo.a=0x%08X, &oo.b=0x%08X, &oo.c=0x%08X, &oo.d=0x%08X 
    ", sizeof(oo), &oo, &oo.a, &oo.b, &oo.c, &oo.d);
    72     /* 8字节对齐的结构体地址分配 */
    73     printf("xx=%d, &xx=0x%08X, &xx.a=0x%08X, &xx.b=0x%08X, &xx.px=0x%08X, &xx.c=0x%08X 
    ", sizeof(xx), &xx, &xx.a, &xx.b, &xx.px, &xx.c);
    74 
    75     return 0;
    76 
    77 }

    输出结果

  • 相关阅读:
    浏览器内核
    link和@import的区别
    跨域iframe如何通信
    数组、对象基本操作
    浏览器兼容性问题
    微信H5开发
    前端面试整理
    js多维数组转一维数组
    js实现继承
    javascript函数闭包(closure)
  • 原文地址:https://www.cnblogs.com/skullboyer/p/7762097.html
Copyright © 2020-2023  润新知