关于pragma pack,__attribute__(packed)

2024-02-28 12:18
文章标签 attribute pragma packed pack

本文主要是介绍关于pragma pack,__attribute__(packed),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自https://blog.csdn.net/zhangxiong2532/article/details/50826917
程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏 蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。例如我们设置结构体的对齐方式:

struct student
{int age;char c;
};

对于以上结构体,默认用sizeof输出大小为8字节,默认的字节对齐方式是4,当然我们也可以设置他的对齐 方式,如下:

#pragma pack(2) //(或 pragma(push,4))
struct student
{int age,char c;
};
#pragma pack(pop) //注意这个和push是成对用的

此时用sizeof输出大小是为6,因为对齐方式为2.如果设置对齐方式为1的话,sizeof输出大小则为5;当然有时我们不希望编译器对结构体做对齐处理,而希望按照他原有的大小分配空间,这里就要用到__attribute__((packed)) ,这个意思是告诉编译器不要做对齐处理。

struct Student
{int age;char c;
}__attribute__((packed));
int main()
{struct Student S;printf("%d\n",sizeof(S));return 0;
}

输出大小为 5,其实和一字节对齐方式一样。
到这里可能许多人和我刚开始一样不理解这个__attribute__((packed)) 是个什么东东,这个其实是GUN C 的一大特色,是一种机制,他可以设置函数属性,变量属性,类型属性,packed就是个类型属性.当然__attribute__((packed))还可以用来设置字节对齐属性__attribute__((packed));设置4字节对齐方式,和#pragma pack(4) 效果一样,我的总结大概就是这些.

#include <stdio.h>
typedef struct Student_t
{int age;char c;
}__attribute__((packed)) Student;typedef struct Node_t
{int a;char c;
}__attribute__((aligned(4))) Node;#pragma pack(push,1)
typedef struct List_t
{int a;char c;
}List;
#pragma pack(pop)int main()
{Node A;List B;Student C;printf("%d,%d,%d\n",sizeof(A),sizeof(B),sizeof(C));return 0;
}

输出大小依次为:5,8,5

这篇关于关于pragma pack,__attribute__(packed)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755478

相关文章

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

数据标注:批量转换json文件,出现AttributeError: module ‘labelme.utils‘ has no attribute ‘draw_label‘错误

labelme版本更换为3.11.2 "D:\Anaconda3\Lib\site-packages\labelme\utils\draw.py"缺失?: import ioimport os.path as ospimport numpy as npimport PIL.Imageimport PIL.ImageDrawimport PIL.ImageFontdef label_co

if !defined与pragma once

两者的共同点都是为了避免同一个文件被include多次,但是各有千秋。 在用VC6.0向导生成的头文件中,经常可以看见如下的代码段:  #if !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_)  #define AFX_RESIZABLELAYOUT_H__INCLUDED_  #if _MSC_VER > 1000  #pragma once  #e

Attribute Recognition简记1-Video-Based Pedestrian Attribute Recognition

创新点 1.行人属性库 2.行人属性识别的RNN框架及其池化策略 总结 先看看行人属性识别RNN结构: backbone是ResNet50,输出是每一帧的空间特征。这组特征被送到两个分支,分别是空间池化和时间建模。最后两种特征拼接。然后分类(FC)。 LSTM关注帧间变化。受cvpr《Recurrent Convolutional Network for Video-Based Person

VirtualBox安装VirtualBox Extension Pack,支持USB No USB devices connected after upgrade

安装步骤及出现问题解决No USB devices connected after upgrade: 一、本要主机ubuntu14.04,安装virtualbox,支持usb设置步骤: 1.安装VirtualBox. 可以从https://www.virtualbox.org官方站点下载或者从软件中心。 2.在VirtualBox里安装Windows; 3.为USB2.0,你需要

AttributeError: module ‘tensorflow_core._api.v2.config’ has no attribute ‘experimental_list_devices’

找到 tensorflow_backend.py 源文件的第506行 _LOCAL_DEVICES = tf.config.experimental_list_devices() 改成 devices = tf.config.list_logical_devices()_LOCAL_DEVICES = [x.name for x in devices]

Unity中常用的Attribute及其使用

菜单相关 PreferenceItem 使用该属性可以定制Unity的Preference界面,如Vscode插件。官方示例: public class ExampleScript : MonoBehaviour{// Have we loaded the prefs yetprivate static bool prefsLoaded = false;// The Preferencespu

Anndata: AttributeError: ‘DataFrame’ object has no attribute ‘dtype’

Anndata: AttributeError: ‘DataFrame’ object has no attribute ‘dtype’ 背景解决方法 背景 在使用anndata做切片时,比如下面这样的例子 sub_rna = rna[:10] # rna is anndata 出现如下报错: AttributeError: ‘DataFrame’ object has

100特殊效果技能包:100 Special Skills Effects Pack

总计177个, 包括100++个概念FX! 这个资源包含几个 FX。 魔术,冰块,鲜血,恶魔,毒药,行星,斜线,爆炸和其他特殊效果正等着您。 该asset的主要功能。: [1]:Standard, URP&HDRP(Distort 除外) 工作环境支持 [2] 高规格(类似 PC)和低规格(类似 Mobile)支持全部 [3]:所有特殊效果均支持HDR。而且它看起来更华丽 [4]:自定义 sh

Error:(106) Attribute quot;rippleColorquot; has already been defined

compile 'com.github.navasmdc:MaterialDesign:1.5@aar' 扁平化设计,导入出现: Error:(106) Attribute "rippleColor" has already been defined 解决: compile 'com.github.navasmdc:MaterialDesign:1.3.2'