C++ 普通阵列可以放入cpu寄存器吗?
在以下情况下,普通数组(C++ 普通阵列可以放入cpu寄存器吗?,c++,c++11,cpu-registers,C++,C++11,Cpu Registers,在以下情况下,普通数组(arr)能否放入cpu寄存器中: int arr[6] {/*some values*/}; const auto lambda_f = [arr](int input) {/*some manipulations on array elements and input*/}; // further usage of lambda_f 如果不能,我应该如何重写代码使之成为可能 编辑:当然,我指的是lambda中数组的副本。在大多数平台上,int[6]的信息太多,无法放在
arr
)能否放入cpu寄存器中:
int arr[6] {/*some values*/};
const auto lambda_f = [arr](int input) {/*some manipulations on array elements and input*/};
// further usage of lambda_f
如果不能,我应该如何重写代码使之成为可能
编辑:当然,我指的是lambda中数组的副本。在大多数平台上,
int[6]
的信息太多,无法放在单个寄存器中,当然,您可以将指针放在适合容纳指针的寄存器中的数组中。或者,如果您想询问数组的内容是否可以存储在某组寄存器中,那么这是可能的
但这完全取决于数据的使用方式,以及编译器是否认为寄存器对其他数据更有价值。如果我可以假设您发布的代码实际上在一个函数块中,那么任何优化编译器都会完全忽略您发布的代码,并将arr
和lambda\u f
都去掉,因为您从未使用过它们
确定答案的唯一方法是在使用
lambda_f
的特定实际代码上进行测试,并检查生成的程序集。在大多数平台上,int[6]
的信息太多,无法放在单个寄存器中,当然,您可以将指针放入适合保存指针的寄存器中的数组中。或者,如果您想询问数组的内容是否可以存储在某组寄存器中,那么这是可能的
但这完全取决于数据的使用方式,以及编译器是否认为寄存器对其他数据更有价值。如果我可以假设您发布的代码实际上在一个函数块中,那么任何优化编译器都会完全忽略您发布的代码,并将arr
和lambda\u f
都去掉,因为您从未使用过它们
确定答案的唯一方法是在确实使用lambda_f的特定实际代码上进行试验,并检查生成的程序集。一般来说,是的。但这取决于特定的平台。如果您使用的是最新的Intel x86-64芯片,它将具有对256位(32字节)整数进行运算的“AVX2”指令 您的
int-arr[6]
是4*6=24字节,因此它将适合于单个AVX寄存器,然后您可以在其上使用AVX2整数指令。您只需要忽略寄存器的额外8字节,但这通常不是问题
如果您需要支持较旧的处理器,可以改用SSE2,这将适用于大多数现代ish x86系统。但一次只能操作128位(4整数)
第一步是将数据加载到宽寄存器中。例如,请参见此处:一般来说,是的。但这取决于特定的平台。如果您使用的是最新的Intel x86-64芯片,它将具有对256位(32字节)整数进行运算的“AVX2”指令 您的
int-arr[6]
是4*6=24字节,因此它将适合于单个AVX寄存器,然后您可以在其上使用AVX2整数指令。您只需要忽略寄存器的额外8字节,但这通常不是问题
如果您需要支持较旧的处理器,可以改用SSE2,这将适用于大多数现代ish x86系统。但一次只能操作128位(4整数)
第一步是将数据加载到宽寄存器中。有关示例,请参见此处: