2009-07-27 33 views

Trả lời

3

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)
+0

JaredPar dường như không đồng ý - bạn có biết thông tin có thể lấy được ở đâu không? – thecoop

+0

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. –

+0

Tôi đã cập nhật câu trả lời với một số kết quả thú vị. –

6

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ì?

4

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.

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