摘要:
STOP! Bitfields 与对齐 alignCPU访问内 存时,总是以其整数字长为单位读写。比如 x86 CPU总是从4字节的整数倍数地址上,读取4字节数据,它不能随心所欲地从任何位置开始读取任意长度数据。为了效率考虑,默认情况下编译器总是让整数存放于其长度的整数 倍数地址上。在一个结构中,为了做到这一点,有时不得不浪费几个字节。举个例子,我 们定义一个结构:struct { char c; int i;};从字面上看, 这个结构的长度是5个字 节,但默认情况下编译器总是分配8个字节,是为了让 i出现在偏移量 4 地址上。位域 bitfields是 C 语言结构中的一个成员,... 阅读全文
摘要:
网上有文章说C语言的“位域”(bit fields)有可移植性的问题,原因是不同的编译器对位域的实现不同。 我决定用实验验证一下。 一、 实验过程: 1. 准备实验程序 这 是谭浩强C语言课本上第12章12.2节的位域示例程序: main() { struct bs { unsigned a:1; unsigned b:3; unsigned c:4; } bit,*pbit; bit.a = 1; bit.b = 7; bit.c = 15; printf("%d,%d,%d\n", bit.a, bit.b, bit.c); pbit ... 阅读全文
摘要:
网上有文章说C语言的“位域”(bit fields)有可移植性的问题,原因是不同的编译器对位域的实现不同。 我决定用实验验证一下。 一、 实验过程: 1. 准备实验程序 这 是谭浩强C语言课本上第12章12.2节的位域示例程序: main() { struct bs { unsigned a:1; unsigned b:3; unsigned c:4; } bit,*pbit; bit.a = 1; bit.b = 7; bit.c = 15; printf("%d,%d,%d\n", bit.a, bit.b, bit.c); pbit ... 阅读全文
摘要:
BIG Endian 和 Small Endian模式的区别谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存 阅读全文
摘要:
BIG Endian 和 Small Endian模式的区别谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存 阅读全文
摘要:
头文件和中说明了基础数据的长度。float,double和long double的范围就是在IEEE 754标准中提及的典型数据。关键字位长(字节)范围格式化字符串char1-128..127(或0..255,与体系结构相关)%cunsigned char10..255signed char1-128..127int2(16位系统) 或4-32768..32767 或-2147483648..2147483647%i, %dunsigned int2 或40..65535 或0..4294967295%usigned int2 或4-32768..32767 或-2147483648..214 阅读全文
摘要:
头文件和中说明了基础数据的长度。float,double和long double的范围就是在IEEE 754标准中提及的典型数据。关键字位长(字节)范围格式化字符串char1-128..127(或0..255,与体系结构相关)%cunsigned char10..255signed char1-128..127int2(16位系统) 或4-32768..32767 或-2147483648..2147483647%i, %dunsigned int2 或40..65535 或0..4294967295%usigned int2 或4-32768..32767 或-2147483648..214 阅读全文
摘要:
c++ 虚函数机制 效率问题1,多一次查虚表过程2,虚函数 效率低 是因为 执行过程中会跳转两次(首先找到对象的函数表,其次通过该函数表中存的虚函数表地址找到真正的执行地址),这样CPU运行的时候会跳转两次,而普通函数只跳一次。CPU每跳转一次,预取指令基本上就要作废很多,所以效率会很低。”/////////////////////////////////////最后得分者和流水线相关是说得通的,究其原因还是因为存在动态跳转,这会导致分支预测失败,流水线排空。 设想一下,如果说不是虚函数,那么在编译时期,其相对地址是确定的,编译器可以直接生成jmp/invoke指令; 如果是虚函数,多出来的一 阅读全文
摘要:
分支指令预测技术 1.分支指令预测 在程序中一般都包含有分支转移指令,据统计,平均每七条指令中就有一条是分支转移指令.在指令流水线结构中,对于分支转移指令相当敏感。假设在80486 的指令流水线中的第一条指令已进入到译码阶段,而第二条指令已进入到提取阶段(准备进入译码器),如果发现第一条指令是分支指令(如跳转到某个地址),则指令预取队列中下一条及下下条等指令预取无效。这时(确切地说,等到第一条指令执行期间形成了分支的目标地址),需从目标地址中现取指令,并交付执行,同时应立即清除指令预取队列,再将目标地址后面的指令预取过来填到队列中。这表明,一遇到分支指令,整个指令流水线就被打乱一次,稍后才能恢 阅读全文
摘要:
分支指令预测技术 1.分支指令预测 在程序中一般都包含有分支转移指令,据统计,平均每七条指令中就有一条是分支转移指令.在指令流水线结构中,对于分支转移指令相当敏感。假设在80486 的指令流水线中的第一条指令已进入到译码阶段,而第二条指令已进入到提取阶段(准备进入译码器),如果发现第一条指令是分支指令(如跳转到某个地址),则指令预取队列中下一条及下下条等指令预取无效。这时(确切地说,等到第一条指令执行期间形成了分支的目标地址),需从目标地址中现取指令,并交付执行,同时应立即清除指令预取队列,再将目标地址后面的指令预取过来填到队列中。这表明,一遇到分支指令,整个指令流水线就被打乱一次,稍后才能恢 阅读全文