我是靠谱客的博主 受伤薯片,最近开发中收集的这篇文章主要介绍结构体声明当中 __attribute__ ((__packed__))关键字,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

稍微了解过C/C++的人,都会了解它们在建立一个结构体的时候,会进行字节对齐操作,所以往往比世界变量占用的字节数要多出一些,而如何减少内存占用,计算内存使用量,也是很多面试题里经常出现的题目。(字节对齐的详细内容请自行寻找资料,不要依靠本篇文章中的现象跟结果来理解字节对齐)

但是稍微当我们真的不想要字节对齐的时候,有没有办法取消字节对齐?答案是可以,就是在结构体声明当中,加上__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个字节的内存。


这些功能,在你动态的去更改结构体大小,并通过内存来直接访问内部变量时非常好用,就比如redis的sds类型,都是加上了__attribute__ ((__packed__))关键字,来达到这些功能,详细的可以自行阅读redis源码或者观看另一篇博客~

最后

以上就是受伤薯片为你收集整理的结构体声明当中 __attribute__ ((__packed__))关键字的全部内容,希望文章能够帮你解决结构体声明当中 __attribute__ ((__packed__))关键字所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(83)

评论列表共有 0 条评论

立即
投稿
返回
顶部