C++ LLVM内存布局中的向量和数组之间有什么区别?

C++ LLVM内存布局中的向量和数组之间有什么区别?,c++,llvm,llvm-ir,C++,Llvm,Llvm Ir,我有一个数组和一个向量,它们都有相同的数据,比如0,1,2,3,4。 然后我用GEP得到数组的ptr %0 = getelementptr [5 x i32]* %arr, i32 0, i32 3 %1 = load i32* %0 因此,%0是数组中由%arr指向的第四个元素的指针,%1的值是3 但现在,我将指向向量的指针比特转换为指向i32的指针: %2 = bitcast <5 x i32>* %Vec to i32* 我不知道数组和向量在内存中的布局是否有任何不同。 如

我有一个数组和一个向量,它们都有相同的数据,比如0,1,2,3,4。 然后我用GEP得到数组的ptr

%0 = getelementptr [5 x i32]* %arr, i32 0, i32 3
%1 = load i32* %0
因此,%0是数组中由%arr指向的第四个元素的指针,%1的值是3

但现在,我将指向向量的指针比特转换为指向i32的指针:

%2 = bitcast <5 x i32>* %Vec to i32*
我不知道数组和向量在内存中的布局是否有任何不同。 如果没有区别,我认为从向量中得到元素的方法是可以的。
那么,我这样做对了吗?

您可以使用
比特广播
后跟
gep
来获取向量中的第四项,但它是冗余的-您可以使用
gep
本身,方式与使用数组完全相同

使用
gep
时,您不需要了解任何有关内存布局的信息。在任何情况下,向量的内存总是按顺序排列的,这可以从
比特广播
在向量和整数之间的行为推断出来;由于不能
比特广播
数组,它们的内存布局无关紧要。

根据“经常被误解的GEP指令”()问题“GEP可以索引到向量元素吗?”,“这并不总是被强制禁止的,尽管这并不被推荐。它导致优化器中出现尴尬的特殊情况,并导致IR中的根本不一致。在未来,它可能会被彻底禁止。”

所以对向量使用GEP可能不是一个好主意,但它是可行的

在中,它表示“所有这些都代表内存中的“数组”。数组类型表示特定大小的数组,指针类型表示未指定大小/未知大小的数组,向量类型表示允许使用SIMD指令的特定大小的数组。"


所以最好决定是否需要向量。如果是这样,那么'extractelement'指令可能更好()。

所以,我得到的方法是多余的,但还好吧?llvm的文档说GEP只用于聚合数据结构。但是“vector”“不是怨恨。请看。@gongweixue您是对的,但继续阅读,您会看到“索引到的第一个类型必须是指针值,后续类型可以是数组、向量和结构。”(下面还有向量示例)。当然,你的比特广播没有什么问题——事实上,因为比特广播在目标语言中通常是nop,所以输出可能是相同的——但是比特广播后跟gep比gep更不利于优化。但我认为下面的情况意味着:通过每个索引从向量的每个维度获得4个元素的PTR。事实并非如此“从向量中获取4个元素PTR”。它只给GEP注入了4次,是吗?@gongweixue我指的是较大示例块上的第2行代码:
%vptr=getelementptr{i32,}*%svptr,i64 0,i32 1,i32 1
-最终的
i32 1
索引到向量中。内存中的某个向量元素是否在字节边界处?例如在向量中?
%3 = getelementptr i32* %2, i32 3
%4 = load i32* %3