2011-03-17 49 views
0

a是一個數組。那麼a.size()sizeof(a)之間有什麼區別?如何檢索數據類型的大小?

+0

聲明和究竟是什麼類型? – Shinnok 2011-03-17 07:28:15

+1

對這個問題的所有答案都是猜測。您需要提供更多信息。也許是一個小代碼示例。 – 2011-03-17 08:19:36

回答

0

a.size()爲您提供專門針對班級的價值。例如字符串或列表的長度。這取決於班級的類型和實施它的人員。但通常size就像在列表中一樣有意義。

Sizeof是一個運算符,如果您是初學者程序員,您應該避免這種運算符。它被廣泛用於C到alloc內存中。它會返回對象在內存中佔用的空間量。在C++中,我們使用new來動態分配內存。這很容易。有關sizeof的更多信息:http://en.wikipedia.org/wiki/Sizeof

0

不確定a.size(),但sizeof(a)返回其長度爲的字節。如果您想要數組中的元素數量,請將其除以每個元素的大小。例如:

int size = sizeof(myArray)/sizeof(*myArray); 
+0

但我認爲兩者的數據類型都是size_t – avinash 2011-03-17 07:28:21

+1

挑剔:它是以char元素爲單位的大小。也就是說,如果'CHAR_BIT'是16,那麼'sizeof(uint32_t)'將是2。 – 2011-03-17 08:09:34

0

如果a是一個數組 -

int a[5] ; // Taking it as an array that can hold integers. 

現在 -

a.size(); // Error. `a` is not a class type to use `.` operator on it. 

sizeof(a); // Correct. It returns 20 because 5*4 bytes. 
0

sizeof是一元運算符,它返回數據類型的大小,在數字節。

sizeof(std::array<int, 3>) == sizeof(int[3]) == 3 * sizeof(int) 
class Foo 
{ 
    int a, b; 
}; 
sizeof(Foo) == sizeof(int) * 2 

size()template<typename T, size_t S> std::array<T,S>方法返回數組中元素的數目

std::array<int, 3> a = {1,2,3}; 
a.size() == 3; 
3

.size()可以返回任何東西,取決於它是如何實現的。

反正.size()通常返回容器的大小,換言之 - 元件的數量,該容器包含。

sizeof運算符是集成運算符,它返回分配在堆棧上的字節數。例如

 char a[50]; 
     char* b = new char[50]; 
     cout << sizeof(a) << '\n'; 
     cout << sizeof(b); 

打印50(這是50 * sizeof(char) = 50 * 1 = 50),第二行打印8 - 因爲這是指針的大小(我的機器是64,這就是爲什麼它是8,如果我有32位CPU ,它會是4)。

cout << sizeof(*b);將打印1,爲*b取消引用指針和返回數組的第一個元素(這是一樣sizeof(b[0])這是sizeof(char)

換句話說,你最好依靠.size(),如果你想查看元素的數量,如果它是一個容器,並且它提供了這樣的方法,當然。


其他例如:

class A 
{ 
     int a; 
     char b[100]; 
}; 

class B 
{ 
     int a; 
     char* b; 
public: 
     B() 
     { 
       b = new char[100]; 
     } 
     ~B() 
     { 
       delete[] b; 
     } 
}; 
int main() 
{ 
     cout << sizeof(A) << '\n'; 
     cout << sizeof(B) << '\n'; 
     B b; 
     cout << sizeof(b) << '\n'; 
     return 0; 
}

第一個,在x64 plarform,將打印104,因爲我們有100*sizeof(char) + sizeof(int) (=4)104 mod 8 == 0,你就會明白爲什麼);

第二個和第三個將打印相同。 但是請注意,我們在這裏對齊!在x64,對準是在圖8B中,所以sizeof(char *)給出8,sizeof(int)給出4,這使得12 BUT12 mod 8 == 4其!= 0,所以由於取向的,sizeof(B)打印(16模8 == 0 )。

所以,當你使用sizeof,必須非常小心..
希望幫助(:


你對名單的問題,看看這個:

 list< int > lint; 
     list< char > lchar; 
     cout << sizeof(lint) << '\n'; 
     cout << lint.size() << '\n'; 
     cout << sizeof(lchar) << '\n'; 
     lint.push_back(10); 
     lint.push_back(10); 
     cout << lint.size() << '\n'; 
     cout << sizeof(lint) << '\n'; 

所有運營商sizeof將打印相同,取決​​於執行std::list。但第一個.size()將返回0,因爲沒有元素,第二個將返回2,因爲我們有2個e在列表中出現。

2

sizeof(a)a使用的字節數,不包括任何動態分配的內存。這是一個編譯時間常量。你也可以使用它的類型,sizeof(int)給你一個int的字節數。

a.size()通常爲容器類型定義,並給出容器中當前元素的數量(而不是字節數)。這是一個運行時值,在您從容器中添加或刪除對象時發生更改。