地址对齐概念
地址对齐其实就是CPU设计中的一个时空权衡,这里采用的是空间换时间的。主要的解决问题是如何能过快速的读取给定的一个变量。
目前的主流计算机有32位,64位这是地址线,一般数据线与地址线条数相同。
如果放置数据时不考虑地址对齐,32位的CPU读取一个4字节的int最少需要一次内存访问,最多需要2次访问内存。下图中左面,取一个int要两次内存访问,而右边的只需要一次内存访问。
Cache line alignment (cache对齐)
数据跨越两个cache line,就意味着两次load或者两次store。如果数据结构是cache line对齐的, 就有可能减少一次读写。数据结构的首地址cache line对齐,意味着可能有内存浪费(特别是 数组这样连续分配的数据结构),所以需要在空间和时间两方面权衡。
写出C语言的地址对齐宏ALIGN(Ptr, Bytes),其中Ptr是要对齐的地址,Bytes是要对齐的字节数(2的N次方),比如说:ALIGN(13,16)=16
- #define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1))
- #define ngx_align_ptr(p, a) \
- (u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
- 地址d + 对齐Bytes -1, 如果地址d已经是按照Bytes对齐的首地址上,则相加的结果还是在本“行”上,如果d不在对齐的首地址上,那么相加后的结果就在下一“行”上,然后对Bytes的地位字节抹去,仅保留高位字节,从而获取应该对齐的首地址
自我理解:
(((d) + (a - 1)) & ~(a - 1))
之所以取用 (a-1) ,是因为计算机内部计算都是从0开始的,即 0~15,计算机内部处理是 0~15。(待确认)
还有 读的时候是按照内存对齐,个人认为写的时候也必须已经按照内存对齐的顺序,否则数据乱了. 读的不对.
写了一段简单的程序,调试时发现了个问题:
#include <stdio.h>#define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1))
void main()
{
int a = 16;
int c= 30;
printf("sss = %d \n", ngx_align(12,16)); 1)打印返回 : 16
printf("sss1 = %d \n", ngx_align(18,16)); 2) 打印返回 : 32
printf("sss2 = %d \n", ngx_align(15,16));
printf("sss3 = %d \n", ngx_align(16,16));
printf("sss4 = %d\n", c&(~(a - 1)));
}
通过1),2)打印表明,返回的地址都是高地址,内部真正访问的时候回是从高到低的顺序
比如先返回高地址16,访问第一个元素的地址16,第二个元素的地址15,.....等等一次下排
每一段16byte空间都先返回一个高地址. 然后内部访问依次下排,如下图:(还需要再补一段程序验证下)
输出:
sss = 16
sss1 = 32
sss2 = 16
sss3 = 16
sss4 = 16
参考文章:
https://www.cnblogs.com/xudong-bupt/archive/2013/05/13/3076024.html
1: ngx_align_ptr
https://blog.csdn.net/mangobar/article/details/52668859
2:深入理解ngx_align_ptr宏及内存管理
https://blog.csdn.net/niitlcj/article/details/9311189
3:ngx_align_ptr宏
https://blog.csdn.net/xiongping_/article/details/43952907
4:内存地址对齐
https://blog.csdn.net/donkeylong/article/details/4909720
https://www.xuebuyuan.com/3249733.html
QApplication和QCoreApplication区别
https://www.jianshu.com/p/d5cd3d30bdf6
1 .QCoreApplication用于non-gui的应用程序。QApplication用于gui的应用程序。(是否需要包含QtGui库)。
2。继承关系 父----->子 QObject----QCoreApplication---QGuiApplication--QApplication