2012-04-10 45 views
5

Tôi tự hỏi liệu mình có thể sử dụng con trỏ 32 bit trong các ứng dụng 64 bit không?c: sử dụng con trỏ 32 bit trong ứng dụng 64 bit?

Dự án của trường chúng tôi chỉ cho phép chúng tôi biên dịch chương trình c thành ứng dụng 64 bit và họ kiểm tra chương trình của chúng tôi để biết tốc độ và mức sử dụng bộ nhớ. Tuy nhiên, nếu tôi có thể sử dụng con trỏ 32bit, sau đó chương trình của tôi sẽ tiêu thụ ít hơn nhiều bộ nhớ hơn so với 64bit, cũng có thể nó chạy nhanh hơn (nhanh hơn để malloc?)

Thanks for the help

+0

Làm thế nào bạn có thể chắc chắn rằng con trỏ 32-bit sẽ nhanh hơn đáng kể so với con trỏ 64 bit (nếu có)? – Mysticial

+1

ít nhất nó tiêu thụ ít bộ nhớ hơn. Tôi không chắc chắn về điều tốc độ chạy nhanh hơn – kevin

+0

Bạn có chắc chắn nó thậm chí sẽ có ý nghĩa không? Bạn có cấu trúc dữ liệu dựa trên con trỏ khổng lồ không? Cũng lưu ý rằng các hoạt động mở rộng con trỏ trên không hoặc lặp lại có thể thực sự gây ra hiệu suất * giảm *. – Mysticial

Trả lời

0

nó có thể làm giảm trí nhớ sử dụng - nhẹ - nhưng nó sẽ không cải thiện tốc độ khi bạn phải dịch con trỏ ngắn của bạn thành con trỏ tuyệt đối, và điều đó cho biết thêm chi phí, bạn cũng mất hầu hết các lợi ích của việc đánh máy.

Nó sẽ giống như thế này:

typedef unsigned short ptr; 
... 

// pre-allocate all memory you'd ever need 
char* offset = malloc(256); // make sure this size is less than max unsigned int 

// these "pointers" are 16-bit short integer, assuming sizeof(int) == 4 
ptr var1 = 0, var2 = 4, var3 = 8; 

// how to read and write to those "pointer", you can hide these with macros 
*((int*) &offset[var1]) = ((int) 1) << 16; 
printf("%i", *((int*) &offset[var1])); 

với một chút thủ thuật, bạn có thể phát minh ra brk của riêng bạn() để giúp phân bổ bộ nhớ từ bù đắp.

Có đáng không? IMO không.

+1

Nói đúng, mã này dựa trên hành vi không xác định, mặc dù trong thực tế nó có thể sẽ không gây ra vấn đề liên kết trên hầu hết các hệ thống (?). – Lundin

+0

Xin lỗi, nhưng ... ** Ugh. ** Điều này sẽ không bao giờ, bao giờ là một ý tưởng tốt ... nhưng khi đưa ra một gợi ý vô cùng ồ ạt, bạn có thể tại _least_ đã giảm thiểu tiềm năng cho UB: sử dụng 'std :: aligned_storage 'đối với loại nghiêm ngặt nhất được lưu trữ, hãy sử dụng các hàm và hàm C++ phù hợp, v.v. –

23

Sử dụng GCC?

Tùy chọn -mx32 đặt các loại int, long và pointer thành 32 bit và tạo mã cho kiến ​​trúc x86-64. (Intel 386 và AMD x86-64 Options):

Sau đó chuẩn :)

+0

Đó là cách khá nhiều. Lưu ý rằng bạn cần một phiên bản khá gần đây của gcc (4.7, hoặc 4.6 với các bản vá khác nhau) và một binutils khá gần đây. – torek

+0

no m32, TA của chúng tôi nói rằng – kevin

+0

Tại sao không chỉ định rằng ngay từ đầu? Dù sao thì đây vẫn là một câu trả lời tốt hơn cho câu hỏi _real_ (các hạn chế sư phạm tùy ý bất kể) so với hack khủng khiếp đã được chấp nhận. –

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