虚拟内存以及它们是如何结合在一起的
Virtual memory and how do they factor together?
我想我理解内存对齐,但让我困惑的是,指针的地址在一些系统将是在虚拟内存,对吗?所以我所看到的大多数检查/确保对齐似乎只是使用指针地址。物理内存地址不可能对齐吗?这对上交所这样的公司来说不是问题吗?
物理地址将被对齐,因为虚拟内存只将对齐的页面映射到物理内存(并且页面通常为4KB)。
因此,除非您需要对齐>页大小,否则物理内存将按照您的要求对齐。
在SSE的特定情况下,一切都很好,因为您只需要16个字节对齐。
我不知道在任何实际系统中,对齐的虚拟内存地址会导致物理内存地址不对齐。
通常,给定平台上的所有对齐都是2的幂。例如,在x86上,32位整数的自然对齐长度为4字节(2^2)。页大小——它定义了可以在物理内存中映射的块有多细——通常是2的大次方。在x86上,允许的最小页面大小是4096字节(2^12)。在x86上可能需要对齐的最大数据类型是128位(用于XMM寄存器和CMPXCHG16B) 32字节(用于AVX) - 2^5。因为2^12能被2^5整除,你会发现所有的东西都在页面的开始处对齐,而且由于页面在虚拟内存和物理内存中都是对齐的,所以虚拟对齐的地址将始终是物理对齐的。
在更实际的层面上,允许对齐的虚拟地址映射到未对齐的物理地址不仅会使生成代码变得非常困难,而且还会使CPU架构比简单地允许任何对齐更复杂(因为现在我们有奇数大小的页面和其他奇怪的…)
请注意,您可能不时有理由要求比页面更大的对齐。通常,对于用户空间编码,它是否在物理RAM中对齐并不重要(就此而言,如果请求多个页面,它们甚至不太可能是连续的!)。只有在编写设备驱动程序并需要一个大的、对齐的、连续的DMA块时才会出现问题。但即使这样,通常设备也不会坚持大于页面大小的对齐方式。
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 将图形属性与 std::unique_ptr 捆绑在一起
- 你能在 c++ 中将不同的数字类型加在一起吗?
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 为什么push_back和emplace_back结合在一起时,会有不同的行为
- 在浮点精度成为一个问题之前,可以将多少个浮点值加在一起
- 为什么在template函数广播中把两个extensor表达式加在一起不正确
- 实现具有浮点键的类似哈希表的数据结构,其中公差内的值被合并在一起
- 如何在Qt TableView中将列的宽度调整为数据并将最后一部分拉伸在一起
- 编译器如何将链表中的地址字符串在一起?
- 在 c++ 中,两个日志行与 log4Cxx 混合在一起
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- 将许多向量排序在一起
- C++ std:: 并包括它们如何组合在一起?
- 如何将数值变量与计时文字结合在一起
- 将非虚拟接口和多级继承结合在一起
- 虚拟内存以及它们是如何结合在一起的
- 将c#和c++很好地结合在一起
- C++中类的声明将接口与该接口的实现结合在一起