C++ 初始化POD数组中的第一个元素,保持其余元素未初始化

C++ 初始化POD数组中的第一个元素,保持其余元素未初始化,c++,arrays,initialization,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[

我正在处理关键路径上的一个函数。代码如下所示:

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]
将填充一个值,但我不需要初始化它

此代码被反复调用,并且对基准测试结果影响很大,因此将所有内容最小化非常重要。我希望编译器知道它可以初始化第一个元素,因为代码可能会得到更好的优化

如何确保只初始化第一个元素,而数组中的其余元素未初始化?有可能吗


这个问题与,和这样的问题相反


我也知道初始化不同于赋值;以及POD的一些细节以及POD如何影响它。

不确定输入的是什么,特别是因为它有字节类型,并且您正在转换为int32。如果您在x86平台上,请注意背景词(endianness问题)

尝试类似的方法,但要有合适的演员阵容

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];
    ...
}

使用堆栈分配的数组是不可能的。即使在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
    
    常量输入[…];
    std::pairms[…];
    对于(int i=0;i<…;++i)
    {
    ms[i]=std::get_临时_缓冲区(2);
    标准::复制((常量int32_t*)输入+i,(常量int32_t*)输入+i+1,
    std::原始存储迭代器(ms[i].first));
    }
    //后期循环std::返回临时缓冲区(ms[…],首先);在函数末尾
    
    您可以不初始化任何内容,也可以初始化所有内容。在您的情况下,保持数组未初始化,然后分配给它的第一个元素。谢谢@KerrekSB。我有点害怕。如果是这样的话,那么你最好记录在案。