首页 > 其他分享 >c语言中的字节对齐

c语言中的字节对齐

时间:2023-07-18 21:46:03浏览次数:27  
标签:字节 bytes 地址 long 编译器 对齐 语言

今天在学习c语言-结构体中,接触到了字节对齐,以下是对它的记录:

1、什么是字节对齐

从内存访问的效率出发, CPU底层或编译器一般会要求 ,所有对象的地址按某种方式对齐.

这种对齐,我们称之为"字节对齐"

为了提升内存的访问效率 ?

一般来说,字节地址就是要求对象的地址是 n 的倍数.

2、对齐方式

  • n-字节对齐:- 对象地址和大小必须是 n 的倍数(n一般为2的x次幂)

如 :
4-字节对齐 : 所有对象的地址必须为4的倍数

8-字节对齐 : 所有对象的地址必须为8的倍数

16-字节对齐

......

  • 自然对齐

编译器默认的一种对齐方式

对象的地址是对象的长度的倍数

在32bits x86机器,编译器:
		Microsoft Visual C++
		Borland/Code Gear(c++ builder)
		Digital Mars(DMC)
		GNU(gcc)
	对  A char(1byte) 一字节对齐
		a short(2bytes) 二字节对齐
		an int(4bytes) 四字节对齐
		a long(4bytes) 四字节对齐
		a float(4bytes) 四字节对齐
		a  double(8bytes)  8字节对齐 On windows
						  4字节对齐  On linux(除非 -malign-double 8字节对齐)
		a  long long(8bytes) 4字节对齐
		a  long doulbe(10bytes) ?? 具体的对齐方式和编译器、系统有关
		

		any pointer (4bytes)  4字节对齐


​		
在64bits x86机器下,编译器 
​				Microsoft Visual C++
​				Borland/Code Gear(c++ builder)
​				Digital Mars(DMC)
​				GNU(Gcc)
​			和32bits机子,只有以下不同:
​			A long (8 bytes)  8字节对齐.
​			A double (8 bytes) 8字节对齐.
​			A long long (8 bytes) 8字节对齐.
​			A long double (8 bytes with Visual C++,   8字节对齐在Visual C++
​						16 bytes with GCC,			  16字节对齐在GCC
​			Any pointer (8 bytes) 8字节对齐.

3、结构体字节对齐

两个重要的要求

(1) 结构体变量按其最大的自然类型的成员变量的对齐方式对齐;

(2) 结构体的大小必须为其对齐方式的整数倍(一般向上取整).

//在32位的机器下
struct test
{
 char a;//a按 1-字节对齐
 int b;//b按 4-字节对齐
 short c;//从按 2-字节对齐
};

struct test  按其最大成员(int b)的对齐方式来对齐  struct test 按4字节对齐.

//则这个结构体所占用的字节大小位sizeof(struct test)=12;

标签:字节,bytes,地址,long,编译器,对齐,语言
From: https://www.cnblogs.com/lzzcforever/p/17564205.html

相关文章

  • 大语言模型的预训练[2]:GPT、GPT2、GPT3、GPT3.5、GPT4相关理论知识和模型实现、模型
    大语言模型的预训练[2]:GPT、GPT2、GPT3、GPT3.5、GPT4相关理论知识和模型实现、模型应用以及各个版本之间的区别详解1.GPT模型1.1GPT模型简介在自然语言处理问题中,可从互联网上下载大量无标注数据,而针对具体问题的有标注数据却非常少,GPT是一种半监督学习方法,它致力于用大......
  • Go语言的并发
    使用协程这种并发模式是趋势,协程的基本要求是:并发执行和可大量创建。一些语言已经支持协程,下面这个图来自:http://qing.weibo.com/tj/88ca09aa33002ele.html这种并发模式的内核只需要协程和通道就够了。其中协程负责执行代码,通道负责在协程之间传递事件。     协程是轻量级......
  • Go语言Revel框架 准备工作
    一、安装Go参考下面几篇文章:http://golang.org/doc/install 二、设置GOPATH参考下面几篇文章: 三、安装git和hggoget克隆依靠 Git和MercurialInstallingGitInstallingMercurial参考: 四、获得Revelframeworkgogetgithub.com/robfig/revel如果没有设置GOPATH,会下载......
  • Go语言Revel框架 网页请求处理流程
    请求处理流程框架图下图是 Play!Framework 的请求处理流程,Revel框架页是一样的。  图片来自: 对这幅图的说明如下:Playframework是一个无状态的面向请求/回应的框架,所有的HTTP请求都遵循下面的处理流程:框架接收到一个HTTPRequestRouter组件试图从conf/文件中找出对应......
  • Go语言Revel框架,创建一个Web App
    首先请确保Revel环境搭配好了,搭配方式参看: 在命令行依次执行下面命令:cd$GOPATHrevelnewmyapprevelrunmyapp执行的结果提示如下:上面有个提示,CodepathshouldbeinGOPATH,butisinGOROOT。这是因为之前我下载revel代码时,还没有设置GOPATH,goget自动就下载GOROOT目......
  • Go语言Revel框架 的聊天室示例解读
    安装Revel框架请参看下面这篇文章:《Go语言Revel框架准备工作》 运行聊天室例子运行聊天室例子只需执行下面命令:$revelrungithub.com/robfig/revel/samples/chat$revelrungithub.com/robfig/revel/samples/chat~~revel!http://robfig.github.com/revel~2013/03/2511:54:4......
  • Go语言Revel框架 聊天室三种通讯方式分析
    三种机制的切换首页相关的网页请求路由如下:#LoginGET  /GET  /demo                 Application.EnterDemo首页显示输入昵称和三种聊天技术选择入口,选择后form提交到Application.EnterDemo页面。跳转到三种具体的聊天技术页面是通......
  • Go语言用WebSocket的简单例子
    Go语言标准包里面没有提供对WebSocket的支持,但是在由官方维护的go.net子包中有对这个的支持,需要独立下载, Gowebsocketpackage下载地址:http://code.google.com/p/go.net/websocket。Goget命令下载:gogetcode.google.com/p/go.net/websocket Go实现的WebSocket的文档:http://......
  • C语言多文件编译(vs.code)
    C语言多文件编译(vs.code)1.保证已经进行完第一步:配置C语言环境如果还未进行,建议来这里查看2.在扩展商店下载插件C/C++ProjectGeneratorCMakeCMakeTools3.修改settings.json也可以直接用快捷键ctrl+,搜索coderunner并找到ExecutorMap在settings.json中编辑找到......
  • Go语言读取网上Json格式的天气预报数据例子
    天气预报接口使用的是:http://www.weather.com.cn/data/sk/101010100.html这里的Json数据如下:{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"1......