2017-07-16 5 views
6

C++ 14 intro.cpp国:オブジェクトは、ゼロ以外のサイズ、1バイト以上の記憶域を持つことはできますか?

a most derived object shall have a non-zero size and shall occupy one or more bytes of storage 

彼らは

非ゼロサイズ

1バイト以上のを述べるなければならなかったのはなぜストレージ

いつ他のものを持つことはできますか?

+0

1ビットは、私が推測するが、記憶装置の少なくとも1バイト以上あることwouldntの非ゼロのサイズになります...私は – Borgleader

+0

@Borgleaderオブジェクトのサイズを考えることができるすべては常にあるthatsの整数のバイト数。 –

+0

@ n.m。私はそれを知っているかもしれませんが、おそらく全体が読まれることはないという標準の一部です。どうして彼らは非ゼロを指定し、次に「1バイト以上」を指定するのでしょうか?クラリティー? – Borgleader

答えて

4

2つの部分は実際に異なることを言っています。

最も派生オブジェクトは、オブジェクトを使用sizeofが非ゼロのサイズを返すことを意味する非ゼロのサイズ

を持たなければなりません。

最も派生オブジェクト...オブジェクトは、いくつかのバイトメモリの(一つ以上)を占める記憶手段

の1バイト以上を占有しなければなりません。

2番目のステートメントが存在しない場合は、sizeofはゼロ以外のサイズが報告されますが、オブジェクトは実際にはメモリを使用していない可能性があります。

最初のステートメントがなければ、sizeofはゼロを返す可能性がありますが、オブジェクトはまだメモリ内の領域を占有する可能性があります。

どちらも互いに必要であり、直交しています。

+3

格納に必要なバイト数が返されない場合、sizeofにはどのような用途がありますか? – MikeMB

+3

@MikeMB - 空の基本最適化を考えてください。サブオブジェクトによってストレージが「本当に」占有されることはありません。だからこそ、「最も派生した」ということに重点を置いています。 – StoryTeller

+0

@ StoryTeller:良い例です。私はアライメント/パディングについても忘れていました。私は答えが、どんなリターンのサイズ(配列に必要なスペース)とそれが占有されたストレージと必ずしも同じではないのかについての短い説明から利益を得ることができると思います。 – MikeMB

3

クラスにはのサイズがsizeofが返されます)である場合がありますが、実際にはメモリ上のスペースを占有しません。 Ubuntuの14.04 x64でGCC 4.8.4でコンパイル

#include <stdio.h> 

struct Base {}; 

struct Derived : Base 
{ 
    int a; 
}; 

int main() 
{ 
    printf("sizeof(Base) = %d\n", sizeof(Base)); 

    Derived* p = new Derived; 
    void* p1 = p; 
    void* p2 = &p->a; 

    if(p1 == p2) { printf("Good compiler\n"); } 

    return 0; 
} 

:例えば、Empty Base Optimization (EBO)は、以下の例に示すように導出されたオブジェクトのがメモリ上にスペースを占有しないベース部品を製造するために使用されます。

出力:

sizeof(Base) = 1 
Good compiler 
関連する問題