簡體   English   中英

在不使用動態分配的情況下,C++14 替代 C99 復合文字的方法是什么?

[英]What is the C++14 alternative to C99 compound literals, without using dynamic allocation?

我正在開發一個帶有 MPU 的 ARM 處理器的嵌入式系統,使用 C++14,我想保持動態分配的數量,也在初始化期間,因為我更喜歡知道鏈接中使用的確切內存量時間。

在 C99 中,您可以使用復合文字在堆棧或全局范圍上分配內存,請參閱此廢話代碼,該代碼在編譯時在結構中分配結構:

struct Foo {
    struct Foo* next;
};
struct Foo *bar = {
    &(struct Foo){
        &(struct Foo){ NULL }
    }
};

不可能使用任何 GCC 或 Clang 擴展來解決這個問題,只能使用純 C++14 代碼。

我發現模仿這種行為的唯一簡單方法是使用 lambda 函數。 但是,此解決方案不可重入。

struct Foo* bar = [](){
    static struct Foo bar = {
        static struct Foo bar = { nullptr };
        return &bar;
    }();
    return &bar;
}();

lambda 解決方案適用於我的情況,我可以使用宏使其使用起來更舒適,但如果我想將數據結構放在堆棧上,這不是一個解決方案。

解決此問題的最佳 C++ 方法是什么(不使用動態分配)?

我正在嘗試解決的當前問題是派生類樹,我想在編譯時分配它。

我試圖在想象的 C++ 代碼中實現的目標:

RootClass* b = &(DerivedClass1){ &(DerivedClass2){10},
                                 &(DerivedClass2){20},
                                 &(DerivedClass1){ &(DerivedClass0){} }
                               };

我試圖在想象的 C++ 代碼中實現的目標:

嗯,這永遠不會奏效。 不要求這些派生類中的任何一個與基類的大小相同,因此不可能對基類進行指針算術(即使 C++ 允許對指向元素類型為數組的基類指針進行指針算術)派生類。它沒有)。

如果您正在處理單個類型T ,那么您可以這樣做:

T ts[] = {<initializers>};

您可以根據需要使用ts 但這僅適用於正確的數組。

現在,如果你想做你的派生類的事情,你總是可以使用一個tuple作為派生類元素的容器,然后構建一個指向基類元素的指針數組,這樣你就可以從一個元素到另一個元素進行迭代。 C++14 使這有點麻煩,因為它要求您在tuple類型本身中列出類型,但 C++17 的類模板參數推導使其更易於理解:

auto tpl = tuple(DerivedClass2{10}, DerivedClass2{20}, DerivedClass1{DerivedClass0{}});

C++14 版本只是重復了類型。

構建數組需要一些模板元編程技術:

template<typename BC, typename Tpl, std::size_t ...ixs>
auto GetBaseClassArrayHelper(Tpl &tpl, std::index_sequence<ixs...>)
{
    return std::array<BC*, std::tuple_size<Tpl>::value>{static_cast<BC*>(std::get<ixs>(tpl))...};
}

template<typename BC, typename Tpl>
std::array<BC*, std::tuple_size<Tpl>::value> GetBaseClassArray(Tpl &tpl)
{
    return GetBaseClassArrayHelper<BC>(tpl, std::make_index_sequence<std::tuple_size<Tpl>::value>{});
}

現在,這不會讓您將BaseClass*++帶入不同的BaseClass* 你需要有一個指向指針數組的指針,一個BaseClass**才能做到這一點。

暫無
暫無

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

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