美文网首页
C语言进阶

C语言进阶

作者: 山茶小树王勇军 | 来源:发表于2019-10-12 23:26 被阅读0次

    字节序

    由于历史原因,业界存在两种字节序标准,大字序(大端)和小字序(小端);大字序,高字节存在低地址;小字序,高字节存在高地址。x86是小字序,ARM、MIPS等可配置。网络序为便于阅读是大字序。
    htonl(0x123456) 发送消息时需要用htonl宏将数据转成大字序

    字节对齐

    现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序地一个接一个地排放,这就是对齐。

    计算机为什么要对齐?

      各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取,其他平台可能没有这种情况。但是最常见的是,如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,一个int型(假设为 32位)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该int数据,显然在读取效率上下降很多。这也是空间和时间的博弈。

    基于32位系统,是4字节对齐。对于Intel系列CPU而言,非4字节对齐访问只会造成性能下降;对于MIPS、ARM系统的CPU,要避免跨4字节访问,不对齐的部分会丢弃。
    字节对齐问题

    函数

    函数参数

    函数返回值

    强制类型转换

    强制类型转换允许了不同数据结构指针、变量间的赋值,但这种灵活性也可能埋下隐患大数向小数转换问题,会出现数据丢失、数据访问不完整等情况。例如:
    short value = 0x12FF; printf("%d",(char)value); short是两个字节  char是一个字节(范围是-128到127)
    void test2(char *p){*p=1;} void test1(){ulong value; test2(&value)} ulong 4字节,只被改写了1个字节,其他字节没有初始化值是未知的。

    溢出

    字符串

    资源释放

    内存越界

    if语句

    高效编码

    经典案例

    相关文章

      网友评论

          本文标题:C语言进阶

          本文链接:https://www.haomeiwen.com/subject/aprfmctx.html