2013-04-07 12 views
5

私はどのスタック/ヒープ/静的な平均か、それらの間で何が違うのか尋ねていません。私はどの領域にconstオブジェクトを要求していますか?C++ではどのメモリ領域がconstオブジェクトですか?

C++コード:

#include <cstdio> 

using namespace std; 

const int a = 99; 

void f() 
{ 
    const int b = 100; 
    printf("const in f(): %d\n", b); 
} 

int main() 
{ 
    const int c = 101; 
    printf("global const: %d\n", a); 
    f(); 
    printf("local const: %d\n", c); 
    return 0; 
} 

メモリ領域はab、及びcにありますか?そして彼らの生涯は何ですか? C言語に違いはありますか?

住所を取得すればどうなりますか?

+4

アドレスを取得しないと、最適化されている可能性があります。 – Antimony

+1

実際には、それらがメモリ領域にまったく存在する必要はありません。コンパイラはこれらの変数をすべて最適化できます。 'const'は変数の存続期間に何の違いもありません。 – john

+0

@Antimony詳細を教えてください、多くのありがとうございます。 :] – imsrch

答えて

6

これは指定されていません。良い最適化コンパイラは、あなたが表示するコードをコンパイルするときにおそらくのためにそれらのための任意のストレージを割り当てません。あなたが見ることができるように

; f() 
__Z1fv: 
LFB1: 
     leaq LC0(%rip), %rdi 
     movl $100, %esi 
     xorl %eax, %eax 
     jmp  _printf 
LFE1: 
     .cstring 
LC1: 
     .ascii "global const: %d\12\0" 
LC2: 
     .ascii "local const: %d\12\0" 

; main() 
_main: 
LFB2: 
     subq $8, %rsp 
LCFI0: 
     movl $99, %esi 
     xorl %eax, %eax 
     leaq LC1(%rip), %rdi 
     call _printf 
     call __Z1fv 
     movl $101, %esi 
     xorl %eax, %eax 
     leaq LC2(%rip), %rdi 
     call _printf 
     xorl %eax, %eax 
     addq $8, %rsp 
LCFI1: 
     ret 

、定数の値は、マシンコードに直接埋め込まれています。

は実際には、これは私のコンパイラ(g++ 4.7.2が)にあなたのコードをコンパイルし、まったく同じものです。スタック、ヒープ、またはそれらのいずれかに割り当てられたデータセグメントにはメモリがありません。

+0

'a'や' b'が非常に複雑なユーザ定義型の場合はどうなりますか? – imsrch

+0

実際には、実行中のプログラムごとにコード自体がメモリに格納されているため、メモリ内のどこかにあります。 – scones

+0

@ user1477871:それは依存しています。あなたは具体的に答えることが不可能な質問をしています。 – NPE

関連する問題