创建一个具有默认构造函数的未初始化项目数组?

时间:2015-03-12 01:37:11

标签: c++ arrays initialization c++14 default-constructor

给定一个类Foo,它有一些初始化值的默认构造函数:

class Foo {
private:
    uint32_t x;

public:
    constexpr Foo()
        : x { 3 }
    {}
    // ... and some other constructors
};

我需要分配这些Foo的数组。我不想要阵列的元素'要运行的默认构造函数,因为稍后我会明确地初始化每个元素。像这样:

Foo foos[20000];

for (int i = 0; i < 20000; ++i) {
    foos[i] = init(i);
}

有没有办法获得这样一个未初始化的Foo数组,因为我们不允许将Foo的默认构造函数更改为非初始化的Foo[20000] foos = void;

顺便说一句,这就是你在D中创建一个未初始化数组的方式:

let mut foos: [Foo; 20000] = unsafe { std::mem::uninitialized() };

......在Rust中也是如此:

{{1}}

3 个答案:

答案 0 :(得分:2)

如果您使用C++11,则可以使用std::vectoremplace_back()

vector<Foo> foos;
for(int i = 0; i < 20000; ++i)
    foos.emplace_back( /* arguments here */);

答案 1 :(得分:1)

您可能正在寻找的是std::get_temporary_buffer

int main()
{
  size_t n = 20000;
  auto buf = std::get_temporary_buffer<Foo>(n);
  if (buf.second<n) {
    std::cerr << "Couldn't allocate enough memory\n";
    return EXIT_FAILURE;
  }

  // ...

  std::raw_storage_iterator<Foo*,Foo> iter(buf.first);
  for (int i = 0; i < n; ++i) {
    *iter++ = Foo();
  }

  // ...

  std::return_temporary_buffer(buf.first);
}

答案 2 :(得分:1)

也许这可以更准确地回答手头的问题?

#include <type_traits>

class Foo {
private:
    uint32_t x;

public:
    constexpr Foo()
        : x { 3 }
    {}

    constexpr Foo(uint32_t n)
        : x { n * n }
    {}
};

    // ...and then in some function:

    typename std::aligned_storage<sizeof(Foo), alignof(Foo)>::type foos[20000];

    for (int i = 0; i < 20000; ++i) {
        new (foos + i) Foo(i);
    }

缺点似乎是您只能使用构造函数来初始化这些元素,而不是自由函数或其他任何元素。

问题:我可以访问Foo这样的内容:

    Foo* ptr = reinterpret_cast<Foo*>(foos);
    ptr[50] = Foo();