2011-10-25 42 views
2

當您在類方法中聲明struct時,該struct的內存如何分配?例如:方法本地結構是否需要執行默認構造函數

void Foo::Bar(void) 
{ 
    struct timeval a; 

    a.tv_sec = 1; 
    a.tv_usec = 0; 

    ... 
} 

是一個在棧上分配的像任何其他本地數據(intdouble等),或者是所謂的默認構造函數和內存在堆上分配?

如果struct初始化如下:struct timeval a = {0, 0};

試圖決定是將結構設置爲類成員還是將其作爲本地方法,因爲該方法經常被調用並且需要儘可能快。

回答

4

是否像任何其他本地數據(int,double等)一樣被分配到堆棧上,或者是被調用的默認構造函數,以及堆中分配的內存?

它被分配在本地存儲(堆棧)上。
僅當在創建對象時使用任何new版本的操作員(除了可能的位置新)之外,對象將在Freestore(堆)上創建。
此外,您的結構對象不會超出封裝它的函數的範圍。一個Freestore(堆)對象會一直存在,直到你明確地調用delete。

無論何時您創建結構/類的對象,都會針對該結構/類調用適當的構造函數(通過匹配參數類型)。在你的情況下,你不會在創建對象時傳遞任何參數,因此將調用Default構造函數。

如果結構初始化爲如此:struct timeval a = {0,0};

它仍被分配爲本地存儲的對象。

試圖決定是將結構設置爲類成員還是將其作爲本地方法更好,因爲該方法經常被調用並且需要儘可能快。

在本地存儲(堆棧)上創建對象比在Freestore(堆)上創建對象要快。 雖然,在你的情況下,你根本沒有使用堆。

實際剖析示例代碼應告訴您哪一個(本地結構或類成員)更適合您的性能要求。

但是,考慮結構在成爲會員之前如何與班級相關聯。它與您的班級有關係嗎?或者它只是一個實用程序結構。你也應該考慮這個設計方面。

此外,還有several restrictions在什麼可以在地方結構或類內部訪問,所以也記住了。

+0

該對象是一個實用程序結構,這就是爲什麼我想使它成爲本地。沒有「有」關係。不幸的是,這是一個嵌入式平臺,對於所有的意圖和目的,分析工具都不可用,所以我無法通過我的目標上的分析器來運行它。 – LordOphidian

+0

@LordOphidian:它使它成爲一個本地結構。 –

1

在你的例子中,對象被分配到棧上,並且調用默認的構造函數。

+1

而默認的構造函數可能是微不足道的,所以它得到了完全優化。 –

相關問題