2015-03-19 41 views
42

Từ những gì tôi đã tìm thấy cho đến nay rõ ràng là các chương trình được biên dịch cho kiến ​​trúc 64 bit sử dụng gấp đôi RAM cho con trỏ làm lựa chọn thay thế 32 bit - https://superuser.com/questions/56540/32-bit-vs-64-bit-systems.Chi phí sử dụng bộ nhớ cho ứng dụng 64 bit là bao nhiêu?

Điều đó có nghĩa là mã được biên dịch cho sử dụng 64 bit trung bình hai lần hơn RAM so với phiên bản 32 bit?

Tôi bằng cách nào đó nghi ngờ nó, nhưng tôi tự hỏi những gì thực sự là phí. Tôi cho rằng các loại nhỏ, như short, bytechar có cùng kích thước trong kiến ​​trúc 64 bit? Tôi không thực sự chắc chắn về byte mặc dù. Do nhiều ứng dụng làm việc với các chuỗi lớn (như trình duyệt web, v.v.), bao gồm hầu hết các mảng char trong hầu hết các triển khai, chi phí có thể không quá lớn.

Vì vậy, ngay cả khi các loại số như intlong lớn hơn trên 64 bit, liệu nó có ảnh hưởng đáng kể đến việc sử dụng RAM hay không?

+3

'byte' là * không * loại tiêu chuẩn. Với C99 hoặc tốt hơn, hãy bao gồm '' sau đó sử dụng 'uint8_t' nếu bạn cần 8 byte" không được ký ". –

+2

mức sử dụng bộ nhớ sẽ tăng, nhưng (hầu như) không bao giờ tăng gấp đôi –

+11

Toàn bộ điểm tạo CPU mới với địa chỉ rộng hơn và bus dữ liệu là tăng tốc độ thực thi với chi phí kích thước chương trình và mức tiêu thụ RAM_. Đây là trường hợp từ 8 đến 16 đến 32 đến 64. Vì vậy, không có gì mới ở đây. – Lundin

Trả lời

42

Tùy thuộc vào kiểu lập trình (và trên ngôn ngữ, nhưng bạn đang đề cập đến C).

  • Nếu bạn làm việc rất nhiều với con trỏ (hoặc bạn có nhiều tài liệu tham khảo bằng một số ngôn ngữ), mức tiêu thụ RAM tăng lên.
  • Nếu bạn sử dụng nhiều dữ liệu có kích thước cố định, chẳng hạn như double hoặc int32_t, mức tiêu thụ RAM sẽ không tăng lên.
  • Đối với các loại như int hoặc long, nó phụ thuộc vào kiến ​​trúc; có thể có sự khác biệt giữa Linux và Windows. Here bạn thấy các lựa chọn thay thế mà bạn có. Trong ngắn hạn, Windows sử dụng LLP64, có nghĩa là long long và con trỏ là 64 bit, trong khi Linux sử dụng LP64, trong đó long cũng là 64 bit. Kiến trúc khác có thể làm cho int hoặc thậm chí short 64 bit là tốt, nhưng đây là khá phổ biến.
  • floatdouble phải giữ nguyên kích thước trong mọi trường hợp.

Vì vậy, bạn thấy nó phụ thuộc rất lớn vào việc sử dụng các loại dữ liệu.

+1

x86-64 cũng có ABI x32 sử dụng con trỏ 32 bit. Nó có lợi thế hơn bằng cách sử dụng 32-bit x86 của việc có một quy ước gọi nhiều hơn đăng ký theo định hướng và có thể sử dụng 8 GPR bổ sung (và thêm 8 SIMD/FP đăng ký). Ngoài ra, GCC hỗ trợ ILP32 trên AArch64. –

+0

Vì vậy, các ngôn ngữ như Java/C# có nhiều khả năng nhận được hiệu ứng 2x hơn C/C++ (đặc biệt nếu bạn không sử dụng một tấn con trỏ), đúng không? –

+0

@DavidGrinberg Ở đây cũng vậy, điều đó phụ thuộc vào dữ liệu. E. g., Một chương trình có hầu hết dữ liệu của nó trong một mảng riêng như một 'int []' hoặc 'double []', không có nhiều thay đổi. Tuy nhiên, một chương trình xử lý nhiều đối tượng nhỏ sẽ cần nhiều RAM hơn. – glglgl

24

Có một vài lý do khiến mức tiêu thụ bộ nhớ tăng lên. Tuy nhiên, chi phí của 64b so với 32b phụ thuộc từ một ứng dụng khác.

  • Lý do chính là sử dụng rất nhiều gợi ý trong mã của bạn. Tuy nhiên, một mảng được phân bổ động trong mã được biên dịch cho 64 bit và chạy trên hệ điều hành 64 bit sẽ có cùng kích thước với mảng được phân bổ trên hệ thống bit 32 . Chỉ địa chỉ cho mảng sẽ lớn hơn, nội dung kích thước sẽ giống nhau (trừ khi loại kích thước thay đổi - tuy nhiên không nên xảy ra và phải được ghi lại rõ ràng).

  • Tăng thêm dấu chân khác là do liên kết bộ nhớ. Trong chế độ 64 bit, căn chỉnh cần xem xét địa chỉ 64 bit sao cho thêm nên thêm một chi phí nhỏ.

  • Có thể kích thước của mã sẽ tăng. Trên một số kiến ​​trúc ISA 64 bit có thể lớn hơn một chút. Ngoài ra, bạn sẽ bây giờ phải thực hiện cuộc gọi đến địa chỉ 64 bit.

  • Khi chạy trong thanh ghi 64bit là lớn hơn (64bit) vì vậy nếu bạn sử dụng nhiều loại số trình biên dịch cũng có thể đặt chúng trong thanh ghi do đó không nên nhất thiết có nghĩa rằng RAM của bạn dấu chân sẽ đi lên . Sử dụng các biến kép có khả năng tạo ra bộ nhớ tăng nếu chúng không được lưu trữ trong thanh ghi 64b.

  • Khi sử dụng JIT biên soạn ngôn ngữ như Java, .NET có khả năng là sự gia tăng dấu chân của 64b mã sẽ lớn hơn như môi trường thời gian chạy sẽ tạo ra chi phí bổ sung thông qua việc sử dụng con trỏ, cấu trúc điều khiển ẩn vv

Tuy nhiên, không có số ma thuật nào mô tả chi phí dấu chân bộ nhớ 64 bit. Điều đó cần phải được đo từ một ứng dụng khác. Từ những gì tôi đã thấy, Tôi chưa bao giờ tăng hơn 20% dấu chân cho một ứng dụng chạy trên 64 bit, so với 32 bit. Tuy nhiên đó là hoàn toàn dựa trên các ứng dụng tôi gặp phải và tôi đang sử dụng chủ yếu là C và C + +.

+0

Một bước nhảy thường sẽ tương đối 32 bit. Bạn không thể nhảy đến địa chỉ 64 bit tuyệt đối chỉ với một lệnh jmp duy nhất –

+0

chỉ lệnh có 64 bit ngay lập tức là movabs, vì vậy bạn không thể gọi hàm tại địa chỉ ngay lập tức 64 bit hoặc –

+0

Tôi khá chắc chắn bạn có thể thực hiện cuộc gọi đến địa chỉ tuyệt đối 64b. Kiểm tra tại đây: http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383 .pdf – VAndrei

0

Tôi nghĩ rằng có thể có một lý do khác quay trở lại trong các biến đó cần được lưu trữ trong bộ nhớ trên ranh giới 64 bit tại địa chỉ đó là ... xxxxx000 để đọc trong một vết cắn, nếu nó không cần đọc nó trong một byte tại một thời điểm.

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