1

VS(リリース)では、次を実行します。

int main(void)
{
   char b[] = "123";
   char a[] = "1234567";
   printf("%x  %x\n", b,a);
   return 0;
}

a の mem アドレスは b+3 (文字列の長さ) であることがわかります。これは、メモリがギャップなしで割り当てられていることを示しています。これにより、メモリの使用量が最小限に抑えられます。だから、私は今、すべてのコンパイラがそうするだろうと信じています。ここでこの推測を確かめたい。誰かが私にもっと正式な証拠を教えてくれますか、それとも私の推測が偶然に基づいていると教えてくれますか.

4

3 に答える 3

2

いいえ、常にデータの完全なパッキングが保証されるわけではありません。

たとえば、このコードを g++ でコンパイルして実行したところ、違いは 8 でした。

詳細については、こちらをご覧ください。

tl;dr: コンパイラは、プロセッサを支援するために、メモリ内のオブジェクトを定数 (常に機械語の長さ) で割り切れるアドレスにのみ配置できます (それらの場合、そのようなアドレスで作業する方が簡単です)。

UPD: アラインメントに関する興味深い例:

#include <iostream>
using namespace std;

struct A
{
    int a;
    char b;
    int c;
    char d;
};

struct B
{
    int a;
    int c;
    char b;
    char d;
};

int main()
{
    cout << sizeof(A) << " " << sizeof(B) << "\n";
}

私にとっては、印刷されます

16 12
于 2013-08-12T07:31:03.167 に答える