2010-09-23 19 views
5

ví dụ:Cho dù tên biến trong bất kỳ ngôn ngữ lập trình nào có chiếm không gian bộ nhớ

int a=3;//-----------------------(1) 

int a_long_variable_name_used_instead_of_small_one=3;//-------------(2) 

ra (1) và (2) trong đó sẽ có được không gian bộ nhớ nhiều hơn hoặc không gian bằng sẽ aquire?

+11

tên dài như trong (2) sẽ chiếm nhiều bộ nhớ hơn trong đầu lập trình viên :) – Chubsdad

+0

Tiêu đề cho biết "bằng bất kỳ ngôn ngữ lập trình nào" nhưng thẻ nói "C++" (trước khi Martin thêm thẻ "ngôn ngữ bất khả tri") . Vì vậy, đó là một trong nó? – sepp2k

+0

Tất cả các bạn đang xem xét số nguyên mà tôi đang nói đến nhưng tôi nói bất kỳ nơi nào trong bộ nhớ a và a_long_variable_name_used_instead_of_small_one mất một số không gian hoặc không – Guri

Trả lời

7

Cả hai đều chiếm cùng một lượng bộ nhớ. Các tên biến chỉ là để giúp bạn, lập trình viên, hãy nhớ biến là gì, và để giúp trình biên dịch kết hợp các cách sử dụng khác nhau của cùng một biến. Ngoại trừ các biểu tượng gỡ lỗi, chúng không xuất hiện trong mã được biên dịch.

+7

Vì anh ta đã gắn thẻ câu hỏi là ngôn ngữ bất khả tri (trong số những người khác), làm thế nào về các ngôn ngữ hỗ trợ sự phản chiếu trong thời gian chạy? –

+1

Hoặc các ngôn ngữ sử dụng một bản đồ đơn giản từ tên biến để định giá cho biến tra cứu (tôi chắc chắn có các ngôn ngữ thông dịch) – sepp2k

+0

@ sepp2k: Ví dụ, các biến toàn cầu trong Lua được tra cứu bằng cách sử dụng một bản đồ băm. – Puppy

1

Trong trình biên dịch hiện đại, tên của một biến không ảnh hưởng đến lượng không gian cần thiết để giữ nó trong C++.

+1

Ngay cả trong các trình biên dịch cũ hơn, AFAIK. C++ không bao giờ có bất kỳ tính năng nội tâm nào. :) –

5

Tên bạn đặt cho một biến trong C/C++ sẽ không ảnh hưởng đến kích thước của mã thực thi kết quả. Khi bạn khai báo một biến như vậy, trình biên dịch giữ lại không gian bộ nhớ (trong trường hợp int trên x86/x64, bốn byte) để lưu trữ giá trị. Để truy cập hoặc thay đổi giá trị, nó sẽ sử dụng địa chỉ thay vì tên biến (bị mất trong quá trình biên dịch).

0

Không .. Cả hai sẽ chiếm không gian bằng nhau.

2

Nếu hiểu biết của tôi là chính xác, chúng sẽ chiếm cùng một lượng bộ nhớ. Tôi tin rằng (và sẵn sàng để bị bắn hạ trong ngọn lửa) trong C++, tên là biểu tượng để giúp người dùng và trình biên dịch sẽ tạo một khối bộ nhớ đủ để giữ kiểu bạn đang khai báo, trong trường hợp này là int . Vì vậy, cả hai nên chiếm cùng một kích thước bộ nhớ, nghĩa là bộ nhớ cần thiết để giữ một địa chỉ.

6

Trong hầu hết các ngôn ngữ thông dịch, tên sẽ được lưu trữ trong bảng ở đâu đó trong bộ nhớ, do đó chiếm nhiều không gian khác nhau.

17

Trong C++ và hầu hết các ngôn ngữ được biên dịch tĩnh, tên biến có thể chiếm nhiều không gian hơn trong quá trình biên dịch nhưng theo thời gian chạy, tên sẽ bị loại bỏ và do đó không chiếm không gian.

Trong ngôn ngữ thông dịch và các ngôn ngữ được biên dịch cung cấp thời gian chạy nội tâm/phản ánh tên có thể chiếm nhiều không gian hơn.

Ngoài ra, triển khai ngôn ngữ sẽ ảnh hưởng đến số lượng tên biến không gian mất. Người triển khai có thể đã quyết định sử dụng bộ đệm có độ dài cố định cho từng tên biến, trong trường hợp đó, mỗi tên sẽ chiếm cùng một không gian bất kể độ dài. Hoặc họ có thể có không gian được phân bổ động dựa trên độ dài.

+0

cho C++, điều này phụ thuộc nếu bạn biên dịch bằng ký hiệu hay không. Để gỡ lỗi các bãi lõi, tôi đánh giá cao các biểu tượng của mình được chuyển vào thư viện/nhị phân, trong trường hợp này, tên dài có thể ảnh hưởng đến kích thước (mặc dù ONE tên dài sẽ không thực sự ...) –

+3

có, nó làm cho kích thước tệp lớn hơn, bit nó sẽ không mất nhiều bộ nhớ hơn trừ khi bạn chạy nó dưới một trình gỡ lỗi – Ferruccio

1

Tên trường (tên biến mẫu) trong bộ nhớ sử dụng Java, nhưng chỉ một lần cho mỗi trường. Điều này là để phản ánh hoạt động. Cũng vậy với các ngôn ngữ khác dựa trên JVM, và tôi đoán cho DotNet.

2

Đối với C++,

$ cat name.cpp 
int main() { 
    int a = 74678; 
    int bcdefghijklmnopqrstuvwxyz = 5664; 
} 
$ g++ -S name.cpp 
$ cat name.s 
     .file "name.cpp" 
     .text 
     .align 2 
.globl main 
     .type main, @function 
main: 
.LFB2: 
     pushl %ebp 
.LCFI0: 
     movl %esp, %ebp 
.LCFI1: 
     subl $8, %esp 
.LCFI2: 
     andl $-16, %esp 
     movl $0, %eax 
     addl $15, %eax 
     addl $15, %eax 
     shrl $4, %eax 
     sall $4, %eax 
     subl %eax, %esp 
     movl $74678, -4(%ebp) 
     movl $5664, -8(%ebp) 
     movl $0, %eax 
     leave 
     ret 
.LFE2: 
     .size main, .-main 
     .section  .note.GNU-stack,"",@progbits 
     .ident "GCC: (GNU) 3.4.6 20060404 (Red Hat 3.4.6-11.0.1)" 
$ 

Như bạn có thể thấy, không a cũng không bcdefghijklmnopqrstuvwxyz phản ánh trong kết quả lắp ráp. Vì vậy, độ dài của tên biến không quan trọng khi chạy theo bộ nhớ.


Nhưng, tên biến là những người đóng góp lớn cho thiết kế chương trình. Một số lập trình viên thậm chí còn dựa vào các quy ước đặt tên tốt thay vì bình luận để giải thích thiết kế chương trình của họ.

Một câu nói có liên quan từ Hacker News,

Mã nên được viết để diễn tả hoàn toàn chức năng của chương trình để độc giả của con người, và chỉ tình cờ được giải thích bởi các máy tính. Chúng tôi có một thời gian khó nhớ tên ngắn trong một thời gian dài, và chúng tôi có một thời gian khó khăn nhìn vào tên dài hơn và hơn nữa trong một hàng. Ngoài ra, tên ngắn mang khả năng va chạm cao hơn (vì không gian tìm kiếm nhỏ hơn), nhưng dễ dàng hơn để "giữ" trong thời gian ngắn đọc.

Do đó, các quy ước đặt tên cho mọi thứ của chúng tôi nên xem xét đến những hạn chế của bộ não con người. Độ dài của tên biến phải tỷ lệ thuận với khoảng cách giữa định nghĩa của nó và cách sử dụng của nó, và tỷ lệ nghịch với tần số sử dụng của nó.

+0

Câu trả lời tuyệt vời ........ cảm ơn – Guri

0

trình biên dịch là có một lý do ... Họ tối ưu hóa mã để sử dụng một không gian ít càng tốt và chạy càng nhanh càng tốt đặc biệt là hiện đại nhất.

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