我正在使用关键路径上的函数。代码如下:
void ProcessData(const byte* input, size_t size)
{
ALIGN_ARRAY(16) int32_t m0[2] = { ((const int32_t*)input)[0] };
ALIGN_ARRAY(16) int32_t m1[2] = { ((const int32_t*)input)[1] };
...
}
第一个元素m0[0]
是我关心的元素。第二个元素m0[1]
是临时空间,在m
发送到SIMD引擎之前保持对齐。 m0[1]
将填充一个值,但我不需要初始化。
这个代码被重复调用并且对基准测试结果非常有影响,因此最小化所有内容非常重要。我希望编译器知道它可以初始化第一个元素,因为代码可能会更好地优化。
如何确保只初始化第一个元素,并且数组中的其余元素未初始化?它甚至可能吗?
此问题与Initialization of a normal array with one default value,Static array initialization of individual elements in C++和Array initialization with {0}, {0,}?
等问题相反我也知道初始化与分配不同;以及zero-, default- and value-initialization的一些细节以及POD如何影响它。
答案 0 :(得分:1)
不确定输入是什么,特别是因为它具有字节类型并且您正在转换为int32。如果您使用的是x86平台,请注意后缀(字节顺序问题)。
尝试这样的事情,但要使用适当的演员。
void ProcessData(const byte* input, size_t size)
{
ALIGN_ARRAY(16) int32_t m0[2];
m0[0]= = (const int32_t*)input)[0];
ALIGN_ARRAY(16) int32_t m1[2];
m1[0] = (const int32_t*)input)[1];
...
}
答案 1 :(得分:1)
使用堆栈分配的数组是不可能的。即使在C ++ 03中,初始化列表中的任何省略元素都是默认初始化(如果是类类型)或值初始化(如果不是)。你有几个选择:
这是你怎么做的。
const uint8_t input[...];
std::pair< int32_t*, std::ptrdiff_t > ms[...];
for (int i = 0; i < ...; ++i)
{
ms[i] = std::get_temporary_buffer<int32_t>(2);
std::copy((const int32_t*)input + i, (const int32_t*)input + i + 1,
std::raw_storage_iterator<int32_t*, int32_t>(ms[i].first));
}
// later loop std::return_temporary_buffer(ms[...].first); at end of function