【发布时间】:2020-03-07 15:56:51
【问题描述】:
我有几个 64 位整数的大型数组,其值的计算成本很高,因此我目前在我的构建系统中有生成器代码,用于计算常量并生成 .cpp 文件来初始化数组。其中一些是 1d,但其中许多是 2d。以前,我的生成器脚本已这样声明它们(值由我的生成器代码计算)
namespace common{ namespace bitboards{
///// Additional stuff
const bitboard ray_thr_sqs[64][64] = {
{0x81412111090503fe, 0xfc, 0xfa, 0xf6, 0xee,......
};};
但我想在没有 C 类数组的情况下使用更多的 C++ 来完成它。 (其中一些比这更大,大小为 [4096][64])。对于一维数组,我可以只使用 std::array。对于二维的,出于性能原因,我不想使用嵌套的 std::arrays,而是宁愿使用 boost multi_array。
如何定义 const boost multi_array?我试过这个:
//file1.cpp
namespace common{ namespace bitboards{
///////additional stuff
const boost::multi_array<bitboard, 2> ray_thr_sqs = misc::boost_help::makeMultiArray<bitboard, 64, 64>({0x81412111090503fe, 0xfc, 0xfa, 0xf6, 0xee,......
};};
其中 makeMultiArray 是生成数组的辅助函数,而 bitboard 是 uint64_t 的 typedef。 (这个辅助函数需要一个平面初始化列表)这可以编译,但是当我运行它时,数组是空的。我知道为什么它是空的,而且事后很明显:makeMultiArray 没有运行,但我想不出另一种方法来做我想做的事,而不用像数组或嵌套的 std::arrays 一样。
有没有办法用 constexpr 或其他东西来做到这一点,或者有更好的方法来完全不使用我的生成器代码。
edit:这些是在 .cpp 文件的命名空间范围内声明的。
edit 2 下面的评论者现在怀疑存在链接问题,而不是我最初怀疑的问题,我现在同意。我用上面的 makeMultiArray 函数尝试了一个最小的工作示例,它确实有效,所以问题出在其他地方。我在上面添加了命名空间的名称。此外,头文件中的声明如下:
//header.hpp
namespace common{ namespace bitboards{
//This const is definied in generated file1.cpp above which I generate in my build scripts because the are large arrays and expensive to calculate
extern const boost::multi_array<bitboard,2> ray_thr_sqs;
//This is another constant array that is much smaller and I can write by hand in a second cpp file, file2.cpp
extern const std::array<bitboard, 8> ranks;
};};
这里是file2.cpp
namespace common{ namespace bitboards{
//////Additional stuff
const std::array<bitboard, 8> ranks = {0xff, 0xff00, 0xff0000, 0xff000000,
0xff00000000, 0xff0000000000, 0xff000000000000, 0xff00000000000000};
};};
在两个单独的 cpp 文件中的定义会导致我的问题吗?
【问题讨论】:
-
你是在 cpp 文件的命名空间范围的变量中声明这个吗?
-
是的,忽略了。已编辑
-
你能在相应的头文件中发布确切的声明吗?我怀疑这个问题与链接有关,而不是提升使用问题。 stackoverflow.com/a/11478458/1718575
-
我同意。我用我的 makeMultiArray 函数做了一个最小的工作示例,它在我的示例中确实有效,所以我在上面添加了额外的细节。特别是,有几个这样的常量数组。我在一个 cpp 文件中的构建脚本中生成了一些计算成本很高的大文件,而我在一个单独的 cpp 文件中手动定义了一些小得多的文件。两个单独文件中的定义是否会导致我的问题?
标签: c++ multidimensional-array boost constants boost-multi-array