2013-04-07 16 views
5

Tôi không hỏi ý nghĩa của stack/heap/static hoặc khác nhau giữa chúng. Tôi hỏi khu vực một đối tượng const trong?Khu vực bộ nhớ nào là đối tượng const trong C++?

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; 
} 

đó diện tích bộ nhớ là a, bc trong? và tuổi thọ của chúng là gì? Có bất kỳ sự khác biệt nào trong ngôn ngữ C không?

Nếu tôi lấy địa chỉ của họ thì sao?

+4

Nếu bạn không lấy địa chỉ của họ, chúng có thể sẽ được tối ưu hóa. – Antimony

+1

Có thực sự không cần cho họ được trong bất kỳ khu vực bộ nhớ nào cả. Trình biên dịch có thể tối ưu hóa tất cả các biến đó đi. 'const' làm cho không có sự khác biệt với tuổi thọ của một biến. – john

+0

@Antimony Bạn có thể cung cấp thêm chi tiết, cảm ơn rất nhiều. :] – imsrch

Trả lời

6

Điều đó không được chỉ định. Trình biên dịch tối ưu hóa tốt có thể sẽ không phân bổ bất kỳ bộ nhớ nào cho chúng khi biên dịch mã bạn hiển thị.

Trong thực tế, đây là chính xác những gì trình biên dịch của tôi (g++ 4.7.2) thực hiện, biên dịch mã của bạn để:

; 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 

Như bạn có thể thấy, giá trị của các hằng số được nhúng trực tiếp vào mã máy. Không có bộ nhớ trên ngăn xếp, vùng heap hoặc phân đoạn dữ liệu được phân bổ cho bất kỳ bộ nhớ nào.

+0

Điều gì sẽ xảy ra nếu 'a' hoặc' b' là một kiểu người dùng định nghĩa rất phức tạp? – imsrch

+0

thực sự, vì chính mã đó nằm trong bộ nhớ cho mọi chương trình đang chạy, nó ở đâu đó trong bộ nhớ .. – scones

+0

@ user1477871: Nó phụ thuộc. Bạn đang đặt câu hỏi không thể trả lời cụ thể. – NPE

Các vấn đề liên quan