タグ付けされた質問 「sizeof」

sizeofは、式またはデータ型のサイズをバイト単位で返すための標準C / C ++演算子を指します。


5
ラムダのサイズが1バイトなのはなぜですか?
C ++でいくつかのラムダのメモリを使用していますが、そのサイズに少し戸惑っています。 これが私のテストコードです: #include <iostream> #include <string> int main() { auto f = [](){ return 17; }; std::cout << f() << std::endl; std::cout << &f << std::endl; std::cout << sizeof(f) << std::endl; } ここで実行できます:http : //fiddle.jyt.io/github/b13f682d1237eb69ebdc60728bb52598 出力は次のとおりです。 17 0x7d90ba8f626f 1 これは、ラムダのサイズが1であることを示唆しています。 これはどのようにして可能ですか? ラムダは、少なくとも、その実装へのポインタであってはなりませんか?
89 c++  c++11  lambda  c++14  sizeof 



4
この構造はどのようにしてsizeof == 0を持つことができますか?
sizeofを返す構造を要求する古い投稿があり0ます。評判の高いユーザーから、標準ではタイプや変数のサイズを0にすることはできないという高得点の回答がいくつかあります。私はそれに100%同意します。 しかし、この解決策を提示するこの新しい答えがあります: struct ZeroMemory { int *a[0]; }; 反対票を投じてコメントしようとしていましたが、ここで過ごした時間は、私が100%確信していることさえチェックすることを教えてくれました。だから...驚いたことに、両方とも同じ結果gccをclang示しています:sizeof(ZeroMemory) == 0。さらに、変数のサイズは0次のとおりです。 ZeroMemory z{}; static_assert(sizeof(z) == 0); // Awkward... わぁぁぁぁぁ…? ゴッドボルトリンク これはどのように可能ですか?

5
ビット演算は予期しない変数サイズになります
環境 PICマイクロコントローラー用の8ビットCコンパイラーを使用して最初にコンパイルされたCコードを移植しています。符号なしグローバル変数(たとえば、エラーカウンター)がゼロにロールオーバーしないようにするために使用された一般的なイディオムは次のとおりです。 if(~counter) counter++; ここでのビット演算子はすべてのビットを反転し、ステートメントが真であるのcounterは、最大値よりも小さい場合のみです。重要なことに、これは変数のサイズに関係なく機能します。 問題 現在、GCCを使用する32ビットARMプロセッサをターゲットにしています。同じコードが異なる結果を生成することに気づきました。私たちが知る限りでは、ビットごとの補数演算は予想とは異なるサイズの値を返すようです。これを再現するには、GCCでコンパイルします。 uint8_t i = 0; int sz; sz = sizeof(i); printf("Size of variable: %d\n", sz); // Size of variable: 1 sz = sizeof(~i); printf("Size of result: %d\n", sz); // Size of result: 4 出力の最初の行で、期待どおりの結果が得られますi。1バイトです。ただし、のビット単位の補数iは実際には4バイトであり、これとの比較では期待される結果が得られないため、問題が発生します。たとえば、次の場合(i適切に初期化されたはどこですかuint8_t): if(~i) i++; i0xFFから0x00までの「折り返し」が表示されます。この動作は、以前のコンパイラと8ビットPICマイクロコントローラーで意図したとおりに機能していた場合と比較して、GCCで異なります。 次のようにキャストすることでこれを解決できることを認識しています。 if((uint8_t)~i) i++; または、 if(i < 0xFF) …


1
インスタンスを作成せずにstd :: array <T、N>の要素数を取得する方法は?
はありますがstd::array&lt;T, N&gt;::size()、静的ではないため、のインスタンスが必要ですstd::array。配列のインスタンスを作成せずに、それが返す値(Nのstd::array&lt;T, N&gt;)を取得する方法はありますか?通常の配列では、を使用することもできましたがsizeof、sizeof(std::array&lt;T, N&gt;) == N * sizeof(T)本当であるという保証はありません。
9 c++  arrays  c++11  sizeof 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.