首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言字节对齐问题分析1

作者:李云 摘要 字节对齐(alignment)是CPU在性能方面所面临的一个非常重要的问题。...有些处理器能自动处理不对齐数据的访问(对字节对齐要求不严格),但是,有些处理器却无法处理(对字节对齐要求很严格)。...对于c程序员,大部分情况下我们并不考虑字节对齐问题,这并不是说我们并不需要考虑,而是因为碰到这种问题的情况很少。一方面要在特定的处理器上,而另一方面和我们写的程序也有关系。...因此,结果给我们的感觉是”字节对齐与我无关”。 本文通过一小段代码通过在不同处理器上的运行结果引出对字节对齐问题的关注,同时进行原因分析。 1....这其实是一个cpu对齐所引发的问题,下面我们通过对字节对齐问题的分析来探究其背后的原理。后面的分析我们全部针对运行在32位SPARC处理器上的Solaris操作系统进行的。

1.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c语言结构体字节对齐详解

    1.什么是字节对齐 在c语言的结构体里面一般会按照某种规则去进行字节对齐。...//64位下 sizeof(struct st1) = 24 struct st2 { char a; char b; char c; }; //32位和64位下, sizeof...(struct st2)都是3个字节 从以上结果可以看出,结构体st1在32位下是按照4个字节来对齐的,在64位下则是按照8个字节来对齐的,结构体st2则不管32位还是64位则都是按照1字节对齐的。...假设有这样一个结构体如下: struct st3 { char a; int b; }; //那么根据我们第1节所说的规则,在32位系统下,它就应该是8个字节的。...定义结构体时: //用法如下 struct bbb { char a; int b; }__attribute__((packed));//直接按照实际占用字节来对齐,其实就是相当于按照1字节对齐了

    2.6K10

    C语言笔记---(1)初识C语言

    C语言简介 C语言的历史 1972年,贝尔实验室,1972年,丹尼斯·里奇和布莱恩·柯林汉(Brian Kernighan)在B语言的基础上重新设计了一种新语言,这种新语言取代了B语言,所以称为C语言...C语言的源代码可以在任意架构的处理器上使用。 C语言的特点 1.语言简洁灵活 C语言是现有程序设计语言中规模最小的语言之一,C语言的关键字仅仅只有32个,控制语句也只有9个。...C语言是完全模块化和结构化的语言C语言对于输入和输出的处理也是通过函数调用来实现的。...这本书被C语言开发者们称为“K&R”,很多年来被当作C语言的非正式的标准说明。人们称这个版本的C语言为“K&R C”。...应用范围: 1.编译器,JVM,驱动 2.操作系统内核 3.各类软件开发 4.嵌入式设备开发,例:手机 5.等等等 C语言的编译 C语言是一种编译型语言,源码都是文本文件,本身无法执行。

    23.6K12

    C语言字节对齐问题分析2

    因此,我们写的c程序为了获得更高的运行效率就必须最大限度的满足cpu对于字节对齐的要求,编译器在其中起着至关重要的作用。...下面的c程序在编译后运行,在终端将会打出”size of type_t is 8”。为什么是8而不是5呢?这是因为编译器考虑到了运行效率,从而将type_t做了4字节对齐的处理。...对于type_t结构,其内存布局如图1所示,需要指出的是SPARC是big-endian模式,图中b=b0b1b2b3. ?...回到图1,先看看采用字节对齐时的情况,从图中可以看出,当cpu需要分别访问a变量和b变量时,无论如何都只需要分别进行一次内存存取,图中的花括号表示一次 内存存取操作。...此外,更为麻烦的是对于边界不对齐的b,还得将其合成4字节(一部分是来自一个四字节中的b0、b1和b2,另一部分来自另一个4字节中的b3),而这又增加了程序的复杂性,即需要更多的指令来完成。

    1.5K20

    C语言 - 结构体所占字节

    //#pragma pack() //取消4字节对齐 typedef struct node1 { int a; char b; short c; }S1; typedef...8,能整除2,所以直接为c分配2字节的空间。   ...此时结构体所占的字节数为1+3+4+2=10字节   最后由于a,b,c的最终对齐参数分别为1,4,2,最大为4,#pragmapack(n)的默认值为8,则结构体变量最后的大小必须能被4整除。...其在内存中存储方式如下:   |--------int--------| 4字节   |--short-|----|----| 4字节1   而 变量 c 是单独存放在静态数据区的,因此用...,所以需要在s1后面填充4字节达到16,再为b分配8字节的空间;   对于变量c,它的自身对齐参数为4,#pragma pack(n)的默认值为8,则c的最终对齐参数为4,接下来相对于结构体其实地址的偏移量为

    1.6K51

    C语言基础(1

    今天是我正式与c语言接触的第一天,心中忐忑之余我更多的是兴奋,想要用c语言这门专业的编程序语言来提高自己,在学习知识之后我会在csdn上记录自己的学习历程,通过其巩固所学知识和查漏补缺,希望对自己和大家都有所帮助...C语言是一门通用计算机编程语言,广泛用于底层开发,以简易的方式编译、处理低级存储器、产生少量机器码以及不需要任何运行环境支持便可运行的编程语言。...学习重点: ·认识到什么是c语言 ·第一个c语言程序 ·数据类型 ·变量,常量 ·字符串+转义字符+注释 ·选择语句 ·循环语句 ·函数 ·数组 ·操作符 ·常见关键字 ·define定义常量和宏 ·指针...·结构体 写代码步骤:1.创建一个项目; 2.创建一个源文件:单击鼠标右键添加一个新的c++文件,文件名改为text.c; 3.写代码; 4.编译代码   快捷键ctrl+F5 一次运行中有且仅有一个...一个工程中可以有多个.c文件,但是多个.c文件中只能有一个main函数。

    5210

    初识C语言(1)

    什么是C语言C语言是一门通用计算机编程语言,广泛应用于底层开发。...二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制 定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。...[1] 目前2011年12月8 日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标 准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉...1.第一个C语言程序 接下来我们来写第一个C语言程序,printf 是库函数,功能是在屏幕上打印数据信息 - 输出, 库函数是标准库中提供的函数,这些函数是现成的,直接可以使用,但是使用库函数需要包含对应的头文件...q w c这种就是字符类型,整数就是整型,小数就是浮点型。   接下来我们为了更加了解数据类型,我们用sizeof()来求出它们的大小。单位是字节,各个单位的换算也如下图。

    14310

    C语言指针(1

    1.内存与地址 大家对地址都不陌生,就像在生活中住酒店如何找到房间?那不就通过房卡上的房间号先确定楼层在确定房间。而这些房间号我们也叫地址。...在C语言中给地址起了新名叫:指针 所以我们理解的:内存单元的编号 == 地址 == 指针 2.指针变量与地址 2.1 取地址操作符& 在C语言中创建变量其实就是在向内存申请空间。...char b = 'a'; char* p = &b; 2.4 解引用操作符 在C语言中,我们找到地址,就可以对地址所指向的对象,而此时所要用到的就是解引用操作符(*)。...2.5 指针变量的大小 32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4个字节才能存储...64位平台下地址,指针变量大小是8个字节 结论: 32位平台下地址,指针变量大小是4个字节 64位平台下地址,指针变量大小是8个字节 注意指针变量的大小和类型是无关的,只要指针类型的变量,

    11310

    C语言—指针(1

    计算机中的内存如同酒店中每个房间的编号,也是把内存划分为一个个的单元,每个单元的大小取1字节. 1byte(字节) = 8bit(比特) 1kb = 1024byte 1mb = 1024kb 1gb...= 1024mb 1tb = 1024gb 1pb = 1024tb 每个内存单元相当于一个学生宿舍,每个内存单元为1字节,存放8个bit位。...指针变量和地址 2.1 取地址操作符(&) C语言中创建变量就是向内存中申请空间 比如: &: 取地址操作符,是个单目操作符 &a:表示取出a的地址 比如: int 型的变量占4个字节...C语言中我们拿到了地址(指针),就可以找到地址(指针)指向的对象。 这里我们就要介绍一种操作符解引用操作符:* *p的意思是通过p中存放的地址找到指向的空间。...; printf("%p\n",pc); printf("%p\n",pc+1); return 0; } 可以看到代码运行结果如下: char *类型的指针+1跳过一个字节 int *

    6510

    c语言进阶(1

    接着让我们思考两个问题:1.为什么程序运行之前都要被加载到内存当中?快 2.在程序被加载到内存之前,程序在哪里?在硬盘当中。 有关变量   什么是变量?...1.局部的(如果是全局,会导致cpu中长时间占存) 2.不会被写入的(写入就要写回内存,后续还要检测的话,register就体现不出它的意义) 写入是什么意思?...头文件可能会被重复包含,为了保证头文件不被重复包含,我们有两种写法: 1.在开头写上#pragma once 头文件里会包含哪些内容呢? 使用尖括号包含的是c语言的头文件,包含自定义用双引号。...但是在text.c的.o文件当中又找到了这个函数。函数的声明本质上也是在内存上开辟空间,只不过变量保存的是数据,而函数保存的是代码,这个代码保存好之后一般是不可被写入的。...1.全局变量可以跨文件访问吗?可以。 2.函数可以跨文件访问吗?可以。 为什么呢?大型项目一定是多文件的,多个文件之间一定要进行数据交互。如果不能跨文件,交互成本比较高。

    8210

    C语言(指针)1

    1、内存和地址 1.1内存 理解内存和地址,我们可以把它们类比为宿舍楼和房间编号。...在C语言中还给地址起了一个新的名字,叫做指针。可以粗略的认为:地址就是指针,指针就是地址。...作为C语言的灵魂,指针是C语言中功能最强大的机制,在后续的学习中就会慢慢地理解其中的含义。...在32位机器中,有32根地址线,32根地址线有32个0或1的数字信号,把这32根地址线产生的2进制序列当作一个地址,那么一个地址就要32个比特位,也就是4个字节。所以,指针变量的大小就应该是4个字节。...还有一点,前面说了 “&” 操作符取到的只是首地址(最小的地址),所以不管地址是1字节还是4个字节还是8个字节,只要取出首地址就可以了。

    7910

    c语言 xff占几个字节,xff

    知识点:《xff》 收集:充腾谑 编辑:百合仙子 本知识点包括: 1、在计算机中,“a\xff”在内存中占用多少字节数?...为什… 2、C语言中printf(“%d\n”,strlen(“\t\”\065\xff\n”));… 3、问个问题, printf(“%d”,strlen(“\t\”\065\xff\n”)…...\ff中\f是换页符,然后又加了一个字符f,‘ff’也是不合法的,“ff”这是一个字符串 猜你喜欢: 1:在计算机中,“a\xff”在内存中占用多少字节数?...为什… 提示:占用三个字节,依次是0x61(‘a’的ASCII码值)、0xFF、0x00(字符串结束符) 百度嫌我字数不够 2:C语言中printf(“%d\n”,strlen(“\t\”\065\xff...\n”));… 提示:printf函数输出strlen()函数执行的结果,strlen()计算字符串”\t\”\065\xff\n”的字符个数,该字符串中有5个元素,所以会输出5,5个元素分别是: 1

    1.2K20

    C语言】文件操作(1

    例如: c:\code\mycode\test.txt 这里的c:\code\mycode\就是文件路径,test就是文件名主干,.txt就是文件后缀。 文件中不能包含这些字符: * ?...如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽⼆进制形式输出,则在磁盘上只占4个字节(VS2019测试)。...这样每个字符都要转换为ascall码值,所以就由四个字节变为5个字节去存储在文本文件中。 当我们打开文本文件时,显示出的依然是我们原来的值。...c语言底层规定了流到不同设备之间的互相传输,不需要我们去进行操作,底层会自动帮我们去操作,所以我们只需要将数据传到流或者从流中提到数据就能实现整个过程。它跟个中转站一样。...【C 语言】文件操作 ( fopen 文件打开方式详解 )-CSDN博客 这篇文章讲了其中七种的打开方式,讲的很详细了,看懂了这七种其他的自然手到擒来。

    8510

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券