C温故补缺(九):字节对齐与排序
字节对齐与排序
字节对齐的原因与字节排序
取自:VisualEther
原文档下载:Gitee

_packed
_packet用于结构体中变量在内存中的对齐.如
typedef struct test_s{
int i;
char a[3];
char b[5];
char c;
}test_t;
如果按默认对齐方式,不足四字节的按四字节算,那么,
int+char[3]+char[5]+char=24个字节
如果用_packet对齐,就是13个字节
但是在VS2008以后就弃用了这个功能
位域
位域:是定义在结构体中的指定了变量宽度的变量 (变量宽度的单位是bit/位)
如
#include<stdio.h>
struct data{
int i;
int j;
}d;
struct Data{
int i:1;
int j:1;
}D;
int main(){
printf("%d ",sizeof(d));
printf("%d ",sizeof(D));
printf("\n");
}
输出的结果是8和4
int型占4个字节,但指定两位的位域后,输出的却是4个字节?
因为C语言有默认的对齐方式,段内按4字节对齐,所以虽然Data只用了两位,仍要申请4字节的内存
所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
格式:
struct 位域结构名 {
位域列表
type [member_name] : width ;
...
};
type:只能是int,unsigned int和signed int三种
一般说,一个位域只能在一个字节中,一个字节可以有多个位域,有时为了对齐,会填充空位域
struct bs{
unsigned a:5;
unsigned :3; /* 空域 */
unsigned b:4; /* 从下一单元开始存放 */
unsigned c:4
}
如bs的第一个字节只存放a这一个位域,剩下的3位放不下b,c,所以用空位域对齐
位域调用类似结构体变量,用' . '或' -> '成员运算符
C温故补缺(九):字节对齐与排序的更多相关文章
- linux下字节对齐
一,内存地址对齐的概念 计算机内存中排列.访问数据的一种方式,包含基本数据对齐和结构体数据对齐. 32位系统中,数据总线宽度为32,每次能够读取4字节数据.地址总线为32,最大寻址空间为4 ...
- 【C语言】字节对齐(内存对齐)
数据对齐 1. 对齐原则: [原则1]数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma p ...
- <摘录>字节对齐与结构体大小
说明: 结 构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题.这些问题在平时编程的时候也确实不怎么用到,但在一 些笔试面试题目中出是常常出现,对sizeo ...
- C++字节对齐与结构体大小计算
转载注明出处:http://pppboy.blog.163.com/blog/static/30203796201082494026399/ 感谢原创博主的辛勤成果. 说明: 结构体的sizeof值, ...
- C语言:内存字节对齐详解[转载]
一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...
- 字节对齐导致的iOS EXC_ARM_DA_ALIGN崩溃
本文原链接: http://www.cnblogs.com/zouzf/p/4455167.html 先看一下这个链接:http://www.cnblogs.com/ren54/archive/201 ...
- ACE的CDR中的字节对齐问题
大家应该都知道计算机中间都有字节对齐问题.CPU访问内存的时候,如果从特定的地址开始访问一般可以加快速度,比如在32位机器上,如果一个32位的整数被放在能被32模除等于0的地址上,只需要访问一次,而如 ...
- ARM字节对齐问题详解
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...
- C语言之字节对齐
在C语言编程中,有时为了达到减少运行的时间的目的,需要浪费一些空间:而有时为了节省空间,使它的运行时间增长.而字节对齐则是为了访问效率,用空间换取时间. 要掌握字节对齐,首先得明确一下四个概念: 1. ...
随机推荐
- centos7部署Prometheus+Grafana
一.安装Prometheus Server 请从 Prometheus 官方下载 linux 版的二进制压缩包.注意在下载前要选择操作系统为 linux. 执行下面的命令把 prometheus se ...
- Python 第三次实验
一如既往地简单,不到半个小时即可完成 [1] (程序设计)输入一个正整数,输出它的因子分解式.如输入132,则输出132=122311 n=int(input()) print(1,end='') f ...
- java script 日常学习 正则表达式
<!DOCTYPE html><html><head> <title>函数的运用</title> <meta charset=&quo ...
- Kafka开启SASL认证 【windowe详细版】
一.JAAS配置 Zookeeper配置JAAS zookeeper环境下新增一个配置文件,如zk_server_jass.conf,内容如下: Server { org.apache.kafka.c ...
- 云原生之旅 - 3)Terraform - Create and Maintain Infrastructure as Code
前言 工欲善其事,必先利其器.本篇文章我们介绍下 Terraform,为后续创建各种云资源做准备,比如Kubernetes 关键词:IaC, Infrastructure as Code, Terra ...
- 2.Ceph 基础篇 - 集群部署及故障排查
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247485243&idx=1&sn=e425c31a ...
- Elasticsearch:分布式计分
- Grafana配置Alert监控告警
1.添加告警途径 这里以slack为例 测试是否可用 在slack上收到告警通知了 安装插件 # grafana-cli plugins install grafana-image-renderer ...
- Linux下登陆MySQL时遇到报错"RROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) "
前言 作者在2021-07-21时遇到 linux下登陆MySQL时遇到报错"RROR 1045 (28000): Access denied for user 'root'@'localh ...
- 0-mysql数据库下载及安装
1 下载mysql源安装包 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 2 安装mysql源 yu ...