我想知道是否有适当的方法来做到这一点。
给出示例:
struct Test {
static std::array<unsigned, 123> data;
};
std::array<unsigned, 123> Test::data = {};
如果我想将中的所有元素设置data
为某个值,例如5。
我可以做这样的事情:
struct Test {
static std::array<unsigned, 123> data;
private:
static decltype(data) init_data_arr() {
decltype(data) arr = {};
arr.fill(5);
return arr;
}
};
std::array<unsigned, 123> Test::data = Test::init_data_arr();
但是然后我会分配一个额外的内存数组,并在所有数组上进行复制,这似乎并不理想。
另一个较少占用内存的选项将是:
struct Test {
static bool is_init;
static std::array<unsigned, 123> data;
Test() {
if (!is_init) {
is_init = true;
data.fill(5);
}
}
};
bool Test::is_init = false;
std::array<unsigned, 123> Test::data = {};
但是现在,在构建Test结构时,我有额外的开销。
现在,我知道您可以像这样初始化pod数组:std::array<int, 3> a = {1, 2, 3};
但是对于N
大型数组,这将很快变得难以维护。
我遇到的每个解决方案都只fill
在数组类上使用成员函数,但始终将数组视为非静态成员变量,或者将其初始化为main,这对我的情况没有任何帮助。
编辑:我创建了这个实用程序标头,将第二个选项推广化。#pragma一次
#include <utility>
#include <iterator>
#include <algorithm>
#include <type_traits>
namespace Utils {
template<typename Container>
using element_type_t = std::remove_reference_t<decltype(*std::begin(std::declval<Container&>()))>;
template<class Container>
static Container create_filled_container(const element_type_t<Container>& value) {
Container container = {};
std::fill(container.begin(), container.end(), std::move(value));
return container;
}
}
可能可以进一步改善它,但它似乎起作用。用法如下:
std::array<unsigned, 123> Test::data = Utils::create_filled_container<decltype(data)>(456);
将所有元素设置为您指定的任何内容。
Edit2:所以我做了一些更多的测试,它看起来像调用一个函数来填充数组而不是手动执行它并不总是产生相同的程序集。
我在这里设置了一个演示!
Edit3:修改了一些东西,因此它可以是constexpr,这是它的当前形式:
template<class Container>
static constexpr Container create_filled_container(const element_type_t<Container>& value) {
Container container = {};
for (auto it = container.begin(); it != container.end(); ++it)
*it = value;
return container;
}
现在生产相同的组件。
使用constexpr函数或lambda对其进行初始化。没有生成运行时代码。
#include <array>
#include <iostream>
template <unsigned len, unsigned val>
constexpr std::array<unsigned, len> initialize_array()
{
std::array<unsigned, len> ret{};
for (int i = 0; i < len; i++)
ret[i] = val;
return ret;
}
struct Test {
constexpr static std::array<unsigned, 123> data{ initialize_array<123,5>() };
};
int main() {
std::cout << Test::data[4] << "\n";
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句