2013-11-21 7 views
5

當我在dev cpp上運行這個程序時,任務管理器說它約爲79 MB。與GNU C++ 4.7 Codeforces說,這是79112千字節爲什麼布爾似乎佔用與int相同的內存? C++

#include<stdio.h> 
const int N=10010,K=1010; 
struct TPos 
{ 
    int charge; 
    bool ex; 
    TPos() 
    { 
     charge=1<<30; 
     ex=false;  
    } 
}; 
TPos d[N][K]; 

int main() 
{ 
    while(1); 
    return 0; 
} 

但當前parametr被註釋:

#include<stdio.h> 
const int N=10010,K=1010; 
struct TPos 
{ 
    int charge; 
    //bool ex; 
    TPos() 
    { 
     charge=1<<30; 
     //ex=false;  
    } 
}; 
TPos d[N][K]; 

int main() 
{ 
    //while(1); 
    return 0; 
} 

它只有39536 KB。 我認爲布爾應該使用一個字節。爲什麼它的大小增加一倍?

+3

[填充](http://en.wikipedia.org/wiki/Data_structure_alignment#Data_structure_padding) – BoBTFish

+1

你可以嘗試__attribute__ ((packed))看看它是怎麼樣的(但通常不是性能的好習慣) – Leeor

+1

如果你不需要所有int-bits用於charge,你甚至可以將內存需求減少到sizeof(int)。請參閱下面的答案。 (也許一個或多或少的2個主管的權力並沒有太大的差別。) – Tobias

回答

8

除非你打包一個結構,否則它總是會佔用可被字大小分割的內存(因爲內存分配)。例如,您可以在gcc中使用__attribute__(packed)來打包結構。另見here。打包結構可能會減少所需的內存,但幾乎肯定會減慢執行速度。

+2

對,這是可能的,但可能不是一個好的做法,因爲它可能會破壞對齊並可能增加虛假緩存行衝突的機會。另見 - http://digitalvampire.org/blog/index.php/2006/07/31/why-you-shouldnt-use-__attribute__packed/ – Leeor

1

它與結構對齊有關。在某些平臺上,如果它是4字節的倍數,則更容易處理內存。編譯器可能會填充您的結構,使其更易於使用。 如果我是正確的,你可以添加另一個布爾,你會看到沒有額外的空間使用。

檢查編譯器選項以瞭解如何禁用它,但請注意性能可能會受損。

3

由於內存對齊。在這種情況下,boolstructint中對齊。含義 - 有一些額外的未使用的字節。

這意味着,sizeof(your_struct)會給你2 * sizeof(int)

你可以做一些實驗與本 - 多帶些bool的內線它(一個接一個)檢查sizeofstruct茜,通過重新排序的元素,等再次檢查大小,這些都是有益的嘗試瞭解什麼發生。此外,研究結構填充和內存對齊對你來說非常有用。

5

布爾是一個字節,但你在這裏看到的是結構打包。

你的結構體包含一個int,因此編譯器會自動將結構與int大小對齊,以確保它能保證在數組中正確對齊。否則,數組的第二個元素將會在不正確的對齊地址上出現int - 這可能會導致性能下降,甚至導致某些體系結構甚至崩潰。

您可以使用特定於編譯器的編譯指示和屬性來明確地關閉結構包裝,但您不想。如果內存是一個問題,考慮使用數組的結構而不是結構數組。

1

確實,bool通常使用一個字節(雖然它不必)。

但是,C和C++也允許將填充 - 即空白空間 - 添加到結構中以允許對齊。這有點複雜,但基本上當變量在特定邊界上對齊時,內存訪問變得更快。

在這種情況下,添加額外的bool可能會將結構大小從4個字節(僅在int)增加到8個字節,因此允許結構在您的數組內很好地對齊。這一切都取決於你的編譯器當然,但你可以使用sizeof(TPos)來檢查。

大多數編譯器有擴展請求,要求填充特定結構體而不是,即使這會使它們使用速度較慢 - 您可能需要查看此信息。

1

可以使用大小說明符來減小對象的大小(請參閱下面的代碼中的:)。如果你並不真的需要charge全尺寸INT這可能看起來像TPosB

#include <iostream> 

#include<stdio.h> 
struct TPosB 
{ 
    int charge : sizeof(int)-1; 
    bool ex : 1; 
    TPosB() 
    { 
     charge=1 << sizeof(int)-2; 
     ex=false; 
    } 
}; 
TPosB b; 

struct TPos 
{ 
    int charge; 
    bool ex; 
    TPos() 
    { 
     charge=1<<30; 
     ex=false;  
    } 
}; 
TPos a; 

int main() 
{ 
    std::cout << "sizeof(int)" << sizeof(int); 
    std::cout << "\nsizeof(a)=" << sizeof(a); 
    std::cout << "\nsizeof(b)=" << sizeof(b); 

    return 0; 
} 
相關問題