cost 152 ms
有沒有辦法通過刪除“vptr”來減小 object 的大小

[英]Is there a way to decrease the size of the object by removing "vptr"

我有一個使用 CRTP 和 C++20 的代碼: 有沒有辦法刪除“vptr”,所以 object 不會占用 8 個字節(對於 x64),而只會占用 1 個字節? (因為它從未與運行時多態一起使用) 在實際代碼中,層次結構要復雜得多,它具有事件 2 vptr(因此需要 16 個字節)。 是否有類似 ...

為什么在虛擬 function 聲明中使用不同的返回類型會引發錯誤而不是導致重新定義?

[英]Why using a different return type in virtual function declaration throws an error instead of resulting in a redefinition?

底座 class: 派生 class: 上面的代碼拋出“返回類型不相同/協變錯誤”。 我讀過一些關於它的討論。 這個類似,但他們只說如果返回類型不同/協變,它將破壞代碼。 用不同的返回類型覆蓋成員 function 為什么我期望的行為沒有發生? 預期行為:Derived 中的 VPTR 指向 B ...

C++ 如何獲取指向類的虛擬 function 表的指針?

[英]C++ How do i get a pointer to a class' virtual function table?

鑒於: 例子.h 例子.cpp 假設我想從“scratch”創建一個Derived的實例。 由於它包含來自Base的虛擬 function,我將如何獲取其虛擬 function 表的地址,以便我可以執行以下操作: 主文件 這個編譯器是特定的嗎? 如果是這樣,如果有人熟悉它,我正在使用 MinGW。 ...

為什么帶有 vptr 的 object 長 12 個字節?

[英]Why object with vptr is 12 bytes longer?

output 是 我希望它長 8 個字節 - vptr 指針。 但是 rest 4 字節用於什么? 我發現很多論壇帖子(都是幾年前的),人們在其中討論了來自 class 的 object 與 vprt 的長度為 4 或 8 個字節。 我也在網上查了 C++ shell - output 是一樣的 ...

根據 C++ 標准的多態對象存儲布局

[英]Storage layout of polymorphic objects according to C++ standard

我知道如果一個類包含任何虛函數,大多數編譯器(如果不是全部)都會添加一個指向它的對象的 vptr 指針。 有些將其添加為第一個元素,有些將其添加為最后一個。 但是 C++ 標准是否要求使用 vptr 和 vtable? 理論上,任何編譯器都可以以其他方式實現它嗎? 如果是這樣,關於多態對象的存儲布局 ...

派生類可以有多個指向虛擬表的指針嗎?

[英]Can derived classes have more than one pointer to a virtual table?

我正在觀看 BackToBasics 演講:CppCon2019 的Virtual Dispatch 及其替代方案。 演示者說和幻燈片顯示(假設我沒有誤解)派生的 class 從基礎 class 繼承了一個 vtable 指針,並且還具有自己的 vptr。 當然,從技術上講,這不是標准規定的,但我 ...

為什么即使不涉及虛函數,虛繼承也需要一個虛表?

[英]Why does virtual inheritance need a vtable even if no virtual functions are involved?

我讀了這個問題: C++ Virtual class繼承對象大小問題,並想知道為什么虛擬繼承會在類中產生一個額外的vtable指針。 我在這里找到了一篇文章: https : //en.wikipedia.org/wiki/Virtual_inheritance 這告訴我們: 然而,在一般 ...

vptr和vtable是從基類繼承的嗎?

[英]are vptr and vtable inherited from base class?

可以看出, D3在繼承鏈的中間引入了一個新的虛函數@function3() 。 我想知道*-vptr和vtable在發生這種情況時會發生什么。 D3現在是一種新的基類, 但是當我看到vtable條目時,可以看到的是function1() , function2() 。 我認為條目 ...

vptr和vtable如何在下面的虛擬相關代碼中工作?

[英]How vptr and vtable works in the bellow virtual related code?

據我所知,當我們在基類中將函數虛擬化時,編譯器將創建一個可以稱為vptr的指針,並在虛擬函數被覆蓋的情況下創建一個vtable,該表保存虛擬函數的條目,該條目是此類的最新版本。 vptr指向vtable。 從基類派生的類具有相同的故事,它們具有指針vptr和自己的vtable,其中存放最新的虛 ...

在C ++中更改對象的動態類型

[英]Changing dynamic type of an object in C++

在下面的問題中,其中一個答案表明對象的動態類型不能改變: 引用對象的動態類型何時會發生變化? 但是,我聽說CPPCon或其他會議上的某位發言人並非如此。 事實上它似乎不是真的,因為GCC和Clang在以下示例的每個循環迭代中重新讀取vtable指針: https://godb ...

虛擬表和對象切片

[英]Virtual Table and Object Slicing

在對象切片中,當派生類對象被復制到基類對象時,派生類的 _vptr 是否也像 Base 類的其他成員一樣被復制到基類的 _vptr?如果不是為什么? 我觀察到上述代碼段的以下結果。 ...

派生類新的展示位置

[英]placement new with derived class

C ++專家 需要您的幫助,此小頭刮刀: 該代碼非常簡單:在堆棧上有一個基礎對象,在其中放置新的派生對象(是,eeew,但請耐心等待),並調用一個虛擬方法,期望派生的輸出被打印出來。 實際產量 上面的代碼產生以下輸出: 這種行為在MSVC,gcc,clang和我嘗試 ...

使用基類引用而不是指針時發生意外的虛函數調度

[英]Unexpected virtual function dispatch when using base class reference instead of pointer

假設我有一個簡單的類層次結構,下面是一個通用的api: 當我使用基類指針時,我得到正確的調度,如下所示: 正確打印的內容: 但是,當我使用基類引用時,此行為是意外的: 打印: 為什么使用引用而不是指針時分派有所不同? ...

了解虛擬繼承類vtable和vptr創建

[英]Understanding virtual inheritance class vtables and vptr creation

下面的代碼是多重繼承,其中每個類都有一個成員變量,一個普通函數和一個虛函數。 該方案的產出如下: 看到gdb中的每個對象,我看到如下: 我們在基類“basec”中看到,在每個虛擬派生類“derivedc”和“derivedd”對象中,為它們的vtable添加了一個vptr ...

非多態類型的Dynamic_cast

[英]Dynamic_cast on non polymorphic types

我可以理解為什么dynamic_cast在這種情況下有效: 但是為什么如果你從B中刪除多態,它仍然有效: 是因為dynamic_cast必須只知道你給出的對象的實際類型有一個參數(如dynamic_cast<void*> / typeid會這樣做),並且在知道真實類型 ...

一個抽象虛擬函數的vtable中有多少個條目?

[英]How many entries are in a vtable for an abstract virtual function?

我讀到一個抽象類仍然可以有一個表。 但是我對它的vtable中有多少個條目感到困惑。 例如,如果我的抽象類是: 那么它的vtable中會有多少個條目? 另外,我是否正確地說這個抽象類的vtable中有1個條目? 謝謝你的幫助。 ...


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