b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

被调用过程 2017-2018-1 学号20155209 《信息安全系统设计基础》第十三周学习总结(8)

电脑杂谈  发布时间:2017-12-18 06:03:52  来源:网络整理

循环过程是怎么计算的

开始将%ebp减去20是为了依次给数组赋值。这里编译器用了非常变态的优化技巧,那就是编译器发现了a[i+1] = a[i] + 3的规律,因此使用加法(将%eax不断加3)代替了i*3的乘法操作,另外也使用了加法(即地址不断加4,而不使用起始地址加上索引乘以4的方式)代替了数组元素地址计算过程中的乘法操作。而循环条件当中的i<5,也变成了3*i<15,而3*i又等于a[i],因此当整个数组当中循环的索引i,满足a[i+1]=15(注意,在循环内的时候,%eax一直储存着a[i+1]的值,除了刚开始的0)的时候,说明循环该结束了,也就是coml和jne指令所做的事。

由于娄老师推荐重点是本章节内容。本章学的很认真没有发现什么问题。

异质结构

异质结构是指不同数据类型的数组组合,比如C语言当中的结构(struct)与联合(union)。在理解数组的基础上,这两种数据结构都非常好理解。

写一个结构的例子

#include <stdio.h>

struct {
    int a;
    int b;
    char c;
} mystruct;

int main(){
    printf("%d\n",sizeof mystruct);
    
}

这是一个非常简单的结构体,这个程序在32位windows系统上,输出结果是12,其他的还可以得到10或者16这样的结果。

这正是因为对齐的原因,这里的对齐不是地址对齐也不是栈分配空间对齐,而是数据对齐。为了提高数据读取的速度,一般情况下会将数据以2的指数倍对齐,具体是2、4、8还是16,得根据具体的硬件设施以及操作系统来决定。

这样做的好处是,处理器可以统一的一次性读取4(也可能是其它数值)个字节,而不再需要针对特殊的数据类型读取做特殊处理。在这个例子来说,也就是说在读取a、b、c时,都可以统一的读取4个字节。特殊的,这里0-3的位置用于存储a,4-7的位置用于存储b,8的位置用于存储c,而9-11则用于填充,其中都是空的。

与结构体不同的是,联合会复用内存空间,以节省内存,比如:

#include <stdio.h>

union {
    int a;
    int b;
    char c;
} myunion;

int main(){
    printf("%d\n",sizeof myunion);
    
}

这段程序输出的结果是4,依旧是32位windows操作系统的结果。这是因为a、b、c会共用4个字节,这样做的目的不言而喻,是为了节省内存空间,显然它比结构体节省了8个字节的空间。它与结构体最大的区别就在于,对a、b、c赋值时,联合会覆盖掉之前的赋值,而结构体则不会,结构体可以同时保存a、b、c的值。

地址对齐的大致规则,一般会依据数据类型的长度来对齐(比如int为4位对齐,double为8位对齐等等),但最低为2。不过这些都不是绝对的,比如double也可能会依据4位对齐,因此具体的对齐规则还是需要根据硬件设施和操作系统决定。

对齐是在拿空间换时间,也就是说,对齐浪费了存储空间,但提高了运行速度。这有点类似于算法的时间复杂度和空间复杂度,两者大部分情况下总是矛盾的。

各种对齐都改如何理解。地址对齐、数据对齐和栈分配对齐的区别。

解答

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


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-54154-8.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 晋敬公
      晋敬公

      而雷军却又说小米手机在中国占有率第一

      • 耿明改
        耿明改

        想不听老美的话有点难

    • 秦东
      秦东

      芝麻糊还有肉末

    热点图片
    拼命载入中...