zoukankan      html  css  js  c++  java
  • C语言__attribute__ ((__packed__))关键字自动字节对齐

    自动字节对齐

    不想要字节对齐的时候,有没有办法取消字节对齐?答案是可以,就是在结构体声明当中,加上__attribute__ ((__packed__))关键字,它可以做到让我们的结构体,按照紧凑排列的方式,占用内存。来段实际代码:

    #include <stdio.h>
    #include <iostream>
     
    using namespace std;
     
    struct test1 {
        char c;
        int i;
    };
     
    struct __attribute__ ((__packed__)) test2 {
        char c;
        int i;
    };
     
    int main()
    {
        cout << "size of test1:" << sizeof(struct test1) << endl;
        cout << "size of test2:" << sizeof(struct test2) << endl;
    }

    运行结果:

    size of test1:8
    size of test2:5

    显而易见,test1结构体里面没有加关键字,它采用了4字节对齐的方式,即使是一个char变量,也占用了4字节内存,int占用4字节,共占用了8字节内存,这在64位机器当中将会更大。
    而test2结构体,再加上关键字之后,结构体内的变量采用内存紧凑的方式排列,char类型占用1字节,int占用4字节,总共占用了5个字节的内存。

    数据结构的对齐的问题。为了让我们的数据结构以最优的方式存储,处理,保证读写数据结构都一一对齐,我们往往采用3种方式:

    1.手动对齐,将数据按从小到大的顺序排列,尽量凑齐。

    2.使用#pragma pack (n)来指定数据结构的对齐值。

    3.使用 __attribute__ ((packed)) ,让编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,这样子两边都需要使用 __attribute__ ((packed))取消优化对齐,就不会出现对齐的错位现象。

    转载:https://blog.csdn.net/u012308586/article/details/90751116

  • 相关阅读:
    极光推送的的栗子
    老师oracle讲义第五天
    oracle学习第五天
    ajax使用
    jstl标签的使用
    json使用
    jsp的el表达式使用
    老师oracle讲义第三天
    oracle学习第一天
    oracle学习第二天
  • 原文地址:https://www.cnblogs.com/-wenli/p/13056243.html
Copyright © 2011-2022 走看看