我撰寫了一個實用程式類(我猜是作為一個輔助類),它只有幾個靜態成員函式可以在另一個類中使用。它沒有任何非靜態成員(變數或函式)。所以它也沒有任何明確的ctors或dtor。
問題是,我的編譯器(GCC v11.2 和 -std=c 20)是否仍然為實用程式類生成隱式默認 ctor 和 dtor?如果是這樣,那么我應該如何防止它這樣做?因為我沒有在我的代碼中初始化該類的任何實體。
uj5u.com熱心網友回復:
(我稍微回避了你的問題,而不是提供主動提供的建議)如果你有一個static函式集合并且你的類不需要任何狀態
class Example
{
public:
static void Foo();
static int Bar();
};
那么你可能一開始就不應該使用 a class,而這些應該是命名空間中的自由函式
namespace Example
{
void Foo();
int Bar();
}
這仍然允許您呼叫它們Example::Foo(),Example::Bar()但是現在您不必擔心有人試圖實體化您的“類”,因為這不是您設計它的目的。
uj5u.com熱心網友回復:
正如已經提到的,您應該為這種型別的背景關系使用命名空間。話雖如此,要回答您的問題,答案是“并非如此”。編譯器必須“創建”一個,但不必為它生成代碼。
我在標準中找不到任何明確說明這一點的內容,但是,如果您創建一個只有靜態函式的簡單類,并查看生成的匯編代碼,您可以看到沒有創建建構式。即使您嘗試使用自動或動態變數來實體化物件,也不會生成任何代碼。簡而言之,由于默認建構式甚至不會做任何事情,因此編譯器沒有理由生成任何代碼。
您可以在此處使用啟用 C 20 的 gcc 11.2查看此內容。請注意,我關閉了優化,只是為了表明它不是-O3洗掉呼叫的 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/337802.html
上一篇:`std::decay_t<T>decay_copy(T&&)`是否等同于`autodecay_copy(auto&&)`?
