初始化POD数组中的第一个元素,保留剩余的元素未初始化

时间:2016-05-07 11:24:09

标签: c++ arrays initialization

我正在使用关键路径上的函数。代码如下:

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 valueStatic array initialization of individual elements in C++Array initialization with {0}, {0,}?

等问题相反

我也知道初始化与分配不同;以及zero-, default- and value-initialization的一些细节以及POD如何影响它。

2 个答案:

答案 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中,初始化列表中的任何省略元素都是默认初始化(如果是类类型)或值初始化(如果不是)。你有几个选择:

  1. 保持数组未初始化,初始化一个元素。
  2. 使用类包装器。
  3. 过度设置场景。
  4. 这是你怎么做的。

    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