Trong .NET struct design guidelines, kích thước này cho kích thước tối đa hợp lý của một cấu trúc là 16 byte. Làm cách nào để xác định cấu trúc của bạn lớn đến mức nào và nó có bị ảnh hưởng bởi kiến trúc mà chương trình của bạn đang chạy không? Giá trị này chỉ là 32 bit, hoặc cho cả hai vòm?Kích thước của cấu trúc trên 32 bit và 64 bit
Trả lời
Có, kích thước của cấu trúc bị ảnh hưởng bởi kiến trúc. C# structs trong 32bit được căn chỉnh ở 4 byte ranh giới, và trong 64bit chúng được liên kết 8 byte.
Ví dụ:
struct Foo
{
int bar;
}
Instances của struct này sẽ mất 4 byte trong quá trình 32bit, và 8 byte trong quá trình 64bit, mặc dù "int bar" chỉ mất 4 byte trên cả hai quá trình 32bit và 64bit .
Cập nhật:
tôi đã làm một số thử nghiệm với điều này.Tôi đã viết mã này:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
struct Bar
{
int a;
}
struct Foo
{
Uri uri;
int a;
}
class Program
{
static void Main(string[] args)
{
Foo[] foo;
long fooBefore = System.GC.GetTotalMemory(true);
foo = new Foo[10];
long fooAfter = System.GC.GetTotalMemory(true);
Bar[] bar;
long barBefore = System.GC.GetTotalMemory(true);
bar = new Bar[10];
long barAfter = System.GC.GetTotalMemory(true);
Foo aFoo = new Foo();
Bar aBar = new Bar();
System.Console.Out.WriteLine(String.Format("[Foo] Size of array of 10: {0}, Marshal size of one: {1}", fooAfter - fooBefore, System.Runtime.InteropServices.Marshal.SizeOf(aFoo)));
System.Console.Out.WriteLine(String.Format("[Bar] Size of array of 10: {0}, Marshal size of one: {1}", barAfter - barBefore, System.Runtime.InteropServices.Marshal.SizeOf(aBar)));
System.Console.ReadKey();
}
}
}
Là một quá trình 64bit, tôi nhận được kết quả này:
[Foo] Size of array of 10: 208, Marshal size of one: 16
[Bar] Size of array of 10: 88, Marshal size of one: 4
Là một quá trình 32bit, tôi nhận được kết quả này:
[Foo] Size of array of 10: 92, Marshal size of one: 8
[Bar] Size of array of 10: 64, Marshal size of one: 4
Quan sát:
- Cấu trúc đơn giản, Thanh, dường như mất 4 byte trên cả 32 bit và các quy trình 64bit
- Cấu trúc khác, Foo, có vẻ mất 8 byte trên 32 bit (4 byte cho int và 4 byte cho tham chiếu đến Uri), nhưng 16 byte trên 64 bit (4 byte cho int, 8 byte cho tham chiếu đến Uri và tôi nghĩ 4 byte cho căn chỉnh)
Nó không phải là một giá trị cứng và nhanh - nó chỉ là một hướng dẫn, một nguyên tắc nhỏ. Tùy thuộc vào tình hình chính xác, 24 hoặc thậm chí 32 byte vẫn có thể được hoàn toàn chính đáng - nhưng nếu cấu trúc của bạn được lớn, bạn thực sự nên tự hỏi liệu nó thích hợp như một cấu trúc ở nơi đầu tiên. Nó có thể là - trong trường hợp này, việc truy cập vào việc sao chép 32 byte đó vào bất kỳ lúc nào bạn thực hiện một nhiệm vụ hoặc chuyển một đối số vào một phương thức (vd) có thể là điều đúng đắn; trong các trường hợp khác, bạn thực sự nên sử dụng một lớp.
Đối với cách bạn xác định cấu trúc của bạn lớn đến mức nào - thường thì nó khá rõ ràng, vì thường là loại giá trị chỉ chứa các loại giá trị khác. Nếu cấu trúc của bạn chứa tham chiếu (hoặc một số IntPtr
/UIntPtr
), thì đó là vấn đề - nhưng điều đó khá hiếm. (Như Mehrdad đã chỉ ra, cũng có vấn đề về việc đệm lót vì mục đích liên kết.)
Sau đó, tôi thấy hiếm khi tôi muốn viết cấu trúc của riêng mình. Tình hình của bạn là gì?
Trong. Net phần lớn các loại không thay đổi kích thước giữa chương trình 32 bit và 64 bit. 2 kiểu giá trị chỉ được định nghĩa bởi khuôn khổ mà sẽ thay đổi kích thước của chúng dựa trên nền tảng là
- IntPtr
- UIntPtr
Trừ khi bạn có một trong những trực tiếp hoặc gián tiếp trong cấu trúc của bạn, nó không nên thay đổi kích thước giữa các nền tảng.
Như Mehrdad chỉ ra, hai lớp khác của lĩnh vực đó sẽ thay đổi kích thước dựa trên nền tảng là
- Pointers
- loại Reference
Tất cả các loại mặc dù sẽ thay đổi trong chính xác cùng một cách. 4 byte trên nền tảng 32 bit và 8 byte trên nền tảng 64 bit.
- 1. Java JDK 32 bit và 64 bit
- 2. Xác định cấu trúc 32/64 bit trong assembly
- 3. 32 bit int * 32 bit int = 64 bit int?
- 4. Tìm hiểu kích thước đối tượng CLR giữa 32 bit so với 64 bit
- 5. Eclipse 32 bit chạy trên 64 bit JVM
- 6. Biên dịch 32 bit Assembler trên 64 bit ubuntu
- 7. QtCreator trên linux: 32 bit so với 64 bit
- 8. Chạy dll 32 bit trên máy 64 bit trong java
- 9. Ứng dụng 32 bit hoặc 64 bit trên hệ điều hành 64 bit?
- 10. chạy nhị phân 32 bit trên máy 64 bit
- 11. Cấu hình Visual Studio để tạo cấu hình 32 bit và 64 bit
- 12. SDK Android 32 bit hoặc 64 bit trên hệ điều hành Windows 64 bit?
- 13. Hệ điều hành iPhone 64 bit hay 32 bit?
- 14. Hoạt động trên 64 bit hoạt động trong kiến trúc 32 bit?
- 15. Xác định Windows 64 bit so với 32 bit
- 16. Tạo 32 bit JavaFX Native Bundle trong máy 64 bit
- 17. Lỗi AJAX ASP.NET AJAX/32-bit đến 64-bit
- 18. Kích thước bit dài trên Windows 64 bit là bao nhiêu?
- 19. .net InstallUtil utility - 32 bit vs 64 bit
- 20. 64 bit bằng cách phân chia 32 bit
- 21. Máy ảo 32 hoặc 64 bit nhanh hơn trên máy 64 bit (vmware)
- 22. Xây dựng 32 bit với 64-bit llvm-gcc
- 23. Nhập 32 bit dll trong 64 bit .Net application
- 24. Chuyển đổi 32 bit dll sang 64 bit dll
- 25. Xác định kiến trúc JRE 32 bit so với 64 bit
- 26. OpenCL: Hướng dẫn popcnt 32 bit và 64 bit trên GPU?
- 27. Có lâu luôn 64 bit trong cả máy 32 và 64 bit
- 28. ODP Oracle.DataAccess.DLL tham chiếu 32/64 bit
- 29. Làm cách nào để nhận libpam.so.0 (32 bit) trên RHEL6 64 bit của tôi?
- 30. C# - không phù hợp toán kết quả hoạt động trên 32-bit và 64-bit
JaredPar dường như không đồng ý - bạn có biết thông tin có thể lấy được ở đâu không? – thecoop
Hmm, có thể tôi nhầm lẫn ở đây. Tôi sẽ xem xét nó nhiều hơn một chút. –
Tôi đã cập nhật câu trả lời với một số kết quả thú vị. –