memory-alignment相关内容

MIPS向左加载字(LWL)和向右加载字(LWR)指令的作用是什么?

我最近一直在阅读MIPS指令集,突然发现了两条我在其他指令集中没有见过的不寻常的指令。 我环顾四周,想找出这些指令到底有什么作用的合理解释,但我所能做的就是它们以某种方式与未对齐的内存访问相关。 例如Wikipedia says: MIPS I要求所有内存访问都与其自然字边界对齐,否则会发出异常信号。为了支持高效的未对齐内存访问,存在以“Left”或“Right”为后缀的加载/存 ..

Yasm:vmovaps指令导致分段错误

问题:movaps出现分段错误。 上下文:x86-64指令vmovaps旨在与Core I系列处理器(我正在运行此系统)上的AVX寄存器一起使用。AVX寄存器的宽度是SSE寄存器的两倍(分别为256位和128位)。指令vmovaps应将对齐的浮点值(32位)向量移入指定的ymm寄存器。 可能的原因:源数据的对齐特别重要,因为不正确对齐的数据是分段错误的来源。然而,即使我已经对齐了我的数 ..
发布时间:2022-04-06 11:09:13 其他开发

用于均匀缓冲区的Vulkan存储器对齐

我正在学习联机教程:vulkan-tutorial其中作者正在添加描述符池和描述符集的功能。 我使用的是Vulkanv1.2.135.0,我的着色器设置为#version 450 我几乎完成了本教程的这一部分,我能够渲染旋转正方形,并且在调试模式下编译和运行时没有收到来自Vulkan层的错误。 我在上面的链接提供的页面底部附近,他在UniformBufferOjbect结构中引入 ..
发布时间:2022-03-11 19:45:15 C/C++开发

使用placement new操作符时我真的需要担心对齐吗?

我读过这篇我什么时候应该担心对齐?但我是仍然不知道我是否必须担心放置 new 运算符返回的未对齐指针 - 就像在这个例子中: A 类 {上市:长双a;长长 b;A() : a(1.3), b(1234) {}};字符缓冲区[64];int main() {//(buffer + 1) 故意使用错误的对齐方式A* a = new (buffer + 1) A();a->~A();} __alig ..
发布时间:2022-01-23 20:26:13 C/C++开发

了解堆栈分配和对齐

我正在尝试了解堆栈对齐的工作原理,如 什么是“堆栈对齐"中所述? 但我很难找到一个小例子来证明上述行为.我正在检查我的函数 foo 的堆栈分配: void foo() {整数a = 0;字符 b[16];b[0] = 'a';} 我用 gcc -ggdb example.c -o example.out 编译了源文件(即没有任何编译器标志),gdb 的汇编程序转储如下: (gdb) 反汇编 ..
发布时间:2022-01-22 12:33:51 其他开发

堆栈分配,为什么会有多余的空间?

为了更好地掌握调用约定和堆栈的处理方式,我进行了一些尝试,但我不明白为什么 main 在设置堆栈时分配了三个额外的双字(在 ).它既不与 8 个字节对齐,也不与 16 个字节对齐,所以据我所知,这不是原因.如我所见,main 需要 12 个字节用于 func 和返回值的两个参数. 我错过了什么? 该程序是在 x86 架构上使用“gcc -ggdb"编译的 C 代码. 编 ..
发布时间:2022-01-22 12:19:23 其他开发

std::tuple 内存对齐

对于元组的伪成员的布局和内存对齐是否有任何正式的规范? 有没有办法修改元组中类型的内存对齐方式?是否受#pragma pack() 指令影响? 例如: typedef std::tuple;我的元组; 是否有任何规范说明这将在内存中与以下内容相同: #pragma pack()//默认打包结构我的结构{uint8_t 优先;uint32_t 秒;} 抱歉,如果这是一个愚蠢的问题 ..
发布时间:2022-01-19 23:53:46 C/C++开发

任意解引用指针的输出

我按如下方式填充内存: char buf[8] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; 然后将无符号长指针依次放在前5个字节并输出结果: char *c_ptr;无符号长 *u_ptr;c_ptr = buf;对于 (int i=0;i 当我在我的 x64 平台上执行此代码时,我得到了我的预期: 4433221155443 ..
发布时间:2022-01-17 14:14:18 C/C++开发

Linux 中的结构分配在 ARM 中失败,但在 x86 中成功

我注意到了一些非常奇怪的事情.假设我定义了以下结构 typedef 结构{uint32_t 一个;uint16_t b;uint32_t c;} 富; 这个结构包含在我从网络接收到的一个大缓冲区中. 以下代码适用于 x86,但我在 ARM 上收到 SIGBUS. extern void * 缓冲区;富我的富;my_foo = (( foo * ) 缓冲区)[0]; 用 memcpy ..
发布时间:2022-01-17 13:35:39 服务器开发

CUDA 结构对齐正在减慢我的代码(可编译示例)

我有一个模拟,可以计算在电场和磁场中移动的带电粒子的 3D 矢量.我试图在 CUDA 中使用 __align__ 说明符 来加快这一速度,认为可能限制因素是全局内存读写,但使用 __align__ 最终减慢了速度(可能是因为它增加了总内存需求).我也尝试使用 float3 和 float4 但它们的性能相似 我创建了此代码的简化版本并将其粘贴在下面以显示我的问题.下面的代码应该是可编译的,并 ..
发布时间:2022-01-10 16:06:20 其他开发

在输入数据中使用各种偏移量时,CUDA 内核启动失败

我的代码给出了一条错误消息,我正在尝试追查它的原因.为了更容易找到问题,我删除了显然与导致错误消息无关的代码.如果您能告诉我为什么以下简单代码会产生错误消息,那么我认为我应该能够修复我的原始代码: #include "cuComplex.h"#include __device__ void compute_energy(void *data, int isample, int ..
发布时间:2022-01-10 15:40:50 其他开发

32 位 x86 汇编中堆栈对齐的职责

我试图清楚地了解谁(调用者或被调用者)负责堆栈对齐.64 位汇编的情况相当清楚,它是由调用者进行的. 参考 System V AMD64 ABI,第 3.2.2 节 堆栈框架: 输入参数区域的末尾应对齐在 16(32,如果__m256 在堆栈上传递)字节边界. 换句话说,应该可以安全地假设,对于被调用函数的每个入口点: 16 |(%rsp + 8) holds(额外的 ..
发布时间:2022-01-06 13:02:59 服务器开发

在 MS Visual Studio 2013 中,我可以使用什么来代替 std::aligned_alloc?

我想使用 C++11 的 std::aligned_alloc,但不幸的是它不适用于 Microsoft Visual Studio 2013. 我正在考虑,intsead,自己实现 aligned_alloc.一个实现应该是什么样的?以下示例无法编译,因为它无法从 void* 转换为 void*&. 模板T*aligned_alloc(std::size_t 大小,std::size_ ..

使 std::vector 分配对齐的内存

是否可以使自定义结构的 std::vector 分配对齐的内存以使用 SIMD 指令进行进一步处理?如果可以使用 Allocator,有没有人碰巧有这样一个他可以共享的分配器? 解决方案 从 C++17 开始,只需使用 std::vector 或任何其他对齐类型.operator new 有对齐版本,它被 std::allocator 用于对齐类型(以及普通的 new 表达式,所以new ..
发布时间:2021-12-24 16:45:11 C/C++开发

自定义 C++ 分配器的引人入胜的例子?

放弃 std::allocator 而支持自定义解决方案的真正好理由是什么?您是否遇到过对正确性、性能、可扩展性等绝对必要的情况?有什么非常聪明的例子吗? 自定义分配器一直是我不太需要的标准库功能.我只是想知道 SO 上是否有人可以提供一些令人信服的例子来证明它们的存在是合理的. 解决方案 正如我所提到的 在这里,我已经看到英特尔 TBB 的自定义 STL 分配器通过更改单个 显着 ..
发布时间:2021-12-24 16:41:02 C/C++开发

编译器重新排序结构

假设我有一个这样的结构: struct MyStruct{uint8_t var0;uint32_t var1;uint8_t var2;uint8_t var3;uint8_t var4;}; 这可能会浪费大量(而不是一吨)空间.这是因为 uint32_t 变量的必要对齐. 实际上(在对齐结构以便它可以实际使用 uint32_t 变量之后)它可能看起来像这样: struct MySt ..
发布时间:2021-12-23 17:21:31 C/C++开发