簡體   English   中英

C++ const數組編譯時間長

[英]C++ long compilation time of const array

我正在 Node.js 中使用 C++ 組件制作游戲。 這個 C++ 組件經常被調用(作為子進程)並且是一個瓶頸。 因此,我將其資產硬編碼為 const arrays 以使其運行得更快。

但是,我注意到我的 C++ 代碼需要很長時間才能編譯。 以下是問題的演示:

#include <iostream>
#include <vector>
#define d 3,
#define _ 999,
// an array holding some game assets
const std::vector<std::vector<std::vector<int>>> STRUCTURES {

    { // you should make 80 copies of this paragraph before benchmarking
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
    },

};
int main(int argc, char **argv){
    // prevent optimizer from ignoring the big array
    std::cout << STRUCTURES.size() << std::endl;
    return 0;
}

如果將中間段落重復 80 次,它的大小將與我的 C++ 程序相當。 我用g++ test.cpp -O3編譯,編譯需要 36 秒。 我不明白為什么這么慢。 有什么我可以改變的,讓它編譯得更快嗎?

不使用動態分配有助於:

template <typename T, int a, int b, int c>
using sprites = std::array<std::array<std::array<T, c>, b>, a>;

但是根本不分配必須更快。 現在我不了解你,但我發現讓初始化程序正確並排列非常乏味(TM)所以,我們不要:

// an array holding some game assets
static constexpr char STRUCTURES[] {
    // pos 0
    "_____________________________________"
    "_____________________________________"
    "_____________________________________"
    "_____________________________________"
    "_________________________ddddddd_____"
    "______________________ddddddddddd____"
    "_____________________ddddddddddddd___"
    "____________________dddddddddddddd___"
    "___________________ddddddddddddddd___"
    "__________________dddddddddddddddd___"
    "_________________dddddddddddddddd____"
    "________________ddddddddddddddddd____"
    "_______________ddddddddddddddddd_____"
    "______________ddddddddddddddddd______"
    "____________dddddddddddddddddd_______"
    "___________dddddddddddddddddd________"
    "__________ddddddddddddddddddd________"
    "_________ddddddddddddddddddd_________"
    "________ddddddddddddddddddd__________"
    "________ddddddddddddddddddd__________"
    "_______dddddddddddddddddddd__________"
    "______dddddddddddddddddddd___________"
    "______dddddddddddddddddddd___________"
    "______dddddddddddddddddddd___________"
    "______ddddddddddddddddddd____________"
    "______ddddddddddddddddddd____________"
    "______dddddddddddddddddd_____________"
    "______ddddddddddddddddd______________"
    "_______ddddddddddddddd_______________"
    "________ddddddddddddd________________"
    "_________ddddddddddd_________________"
    "___________ddddddd___________________"
    "_____________________________________"
    "_____________________________________"
    "_____________________________________"
    "_____________________________________"
    "_____________________________________"
    // pos 1
    // ....
    // ....
    // ....
    "_____________________________________"
    "_____________________________________"
    // pos 81
    "_____________________________________"
    "_____________________________________"
    "_____________________________________"
    "_____________________________________"
    "_________________________ddddddd_____"
    "______________________ddddddddddd____"
    "_____________________ddddddddddddd___"
    "____________________dddddddddddddd___"
    "___________________ddddddddddddddd___"
    "__________________dddddddddddddddd___"
    "_________________dddddddddddddddd____"
    "________________ddddddddddddddddd____"
    "_______________ddddddddddddddddd_____"
    "______________ddddddddddddddddd______"
    "____________dddddddddddddddddd_______"
    "___________dddddddddddddddddd________"
    "__________ddddddddddddddddddd________"
    "_________ddddddddddddddddddd_________"
    "________ddddddddddddddddddd__________"
    "________ddddddddddddddddddd__________"
    "_______dddddddddddddddddddd__________"
    "______dddddddddddddddddddd___________"
    "______dddddddddddddddddddd___________"
    "______dddddddddddddddddddd___________"
    "______ddddddddddddddddddd____________"
    "______ddddddddddddddddddd____________"
    "______dddddddddddddddddd_____________"
    "______ddddddddddddddddd______________"
    "_______ddddddddddddddd_______________"
    "________ddddddddddddd________________"
    "_________ddddddddddd_________________"
    "___________ddddddd___________________"
    "_____________________________________"
    "_____________________________________"
    "_____________________________________"
    "_____________________________________"
    "_____________________________________"
};

朴素的索引助手

現在,當然,您需要整數並將字符映射到某些值(如本例中的 3 和 999)。 為此,我們可以使用一個簡單的索引助手:

struct Helper {
    constexpr int operator()(int a, int b, int c) const {
        switch (auto ch = STRUCTURES[a*37*37 + b*37 + c]) {
            case 'd': return 999;
            case '_': return 3;
        }
        return 0;
    }
};

現在我們可以編寫main來打印隨機的“字形”、“精靈”或任何這些資源:

#include <iostream>
#include <iomanip>

int main() {
    auto a = rand() % 81;

    Helper index;
    for (int b = 0; b < 37; ++b) {
        for (int c = 0; c < 37; ++c)
            std::cout << std::setw(4) << index(a, b, c);
        std::cout << "\n";
    }
}

它打印(我有 81 倍相同的“圖像”):

   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3 999 999 999 999 999 999 999   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3

非天真的索引助手:Boost MultiArray

更少的代碼,更多的功能。 現在您可以使用.size()和 ranged-for:

#include <boost/multi_array.hpp>

int main() {
    constexpr std::array shape {81,37,37};
    boost::const_multi_array_ref<char, 3> view(STRUCTURES, shape);

    auto const& sprite = view[rand() % view.size()];
    for (auto const& row : sprite) {
        for (auto const& cell : row)
            printf("%4d", (cell=='d'? 999 : 3));
        putchar('\n');
    }
}

完整演示現場

  • Naive indexing Helper版本: Live On Coliru

    編譯:(關於大腸桿菌!)

     real 0m0.562s user 0m0.432s sys 0m0.124s

    運行時(在 coliru 上:):

     real 0m0.005s user 0m0.000s sys 0m0.004s
  • Boost Multi-Array 版本: Compiler Explorer / Coliru

我的系統上的可執行文件大小為 118k (GCC) 或 119k (clang)(兩種方法)。

正如 Barmar 和 Sam Varshavchik 所建議的,解決方案是避免使用 std::vector。

向量太多,優化器要花很多時間來處理。 可以使用 std::array 代替。 對於此示例,這意味着:

#include <iostream>
#include <vector>
#include <array>
#define d 3,
#define _ 999,
// an array holding some game assets
const std::vector<std::array<std::array<int,37>,37>> STRUCTURES {

    {{ // you should make 80 copies of this paragraph before benchmarking
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ d d d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ d d d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ d d d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ d d d d d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ d d d d d d d _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
        { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ },
    }},

};
int main(int argc, char **argv){
    // prevent optimizer from ignoring the big array
    std::cout << STRUCTURES.size() << std::endl;
    return 0;
}

請注意,我仍然使用單個 std::vector 作為最外層維度。 這在編譯時不會產生很大的開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM