2012-06-24 34 views
10

Tôi nhầm lẫn về thời gian đánh giá của toán tử sizeof.
Khi nào toán tử sizeof được đánh giá?sizeof toán tử thời gian biên dịch hoặc thời gian chạy

Thời gian đánh giá của nó [compile-time or run-time] tùy thuộc vào ngôn ngữ [C? C++?]?

Chúng tôi có thể sử dụng sizeof trong trường hợp đối tượng được tạo khi chạy [in C++] không?

Trả lời

19

Trong hầu hết các trường hợp, sizeof được đánh giá dựa trên thông tin loại tĩnh (tại thời gian biên dịch, về cơ bản).

Một ngoại lệ (trường hợp duy nhất, tôi nghĩ) là trong trường hợp các mảng có độ dài biến đổi của C99 (VLA).

+0

Một bằng chứng tuyệt vời về những gì một VLA lố bịch vô lý là gì. IMHO rõ ràng biến chiều dài stack tiêu thụ ('alloca') là rất tốt hơn nhiều. – valdo

+3

@ valdo, tôi không thấy điều này được cho là phải chứng minh. Có vẻ bình thường rằng 'sizeof' một đối tượng có kích thước động tại thời gian thực hiện phải được đánh giá tại thời gian thực hiện. Và so sánh với các cơ chế khác như 'alloca' (thậm chí không được chuẩn hóa và không có phạm vi) hoặc' malloc' mà cả hai không biết gì về kích thước của các đối tượng mà chúng tạo ra không phải là rất hữu ích. –

+0

@Jens Gustedt: Xin lỗi, ý tôi là * ví dụ *, không phải là * bằng chứng *. 'alloca' không cần giải phóng/phạm vi rõ ràng. Mã được tạo ra (nhiều hơn hoặc ít hơn) giống hệt với VLAs - di chuyển con trỏ ngăn xếp + thăm dò bộ nhớ ngăn xếp khi vượt qua ranh giới trang. Cá nhân tôi sử dụng 'sizeof' rất tích cực trong lập trình meta (temapltes và vv), và tôi muốn chắc chắn 100% bất cứ thứ gì bên trong' sizeof' sẽ không bao giờ được đánh giá trong thời gian chạy. – valdo

11

Hầu như luôn luôn biên dịch thời gian. Nhưng các ví dụ sau đây có thể quan tâm đến bạn:

char c[100]; 
sizeof(c); // 100 

char* d = malloc(100); 
sizeof(d); //probably 4 or 8. tells you the size of the pointer! 

BaseClass* b = new DerivedClass(); 
sizeof(b); //probably 4 or 8 as above. 

void foo(char[100] x) { 
    sizeof(x); //probably 4 or 8. I hate this. Don't use this style for this reason. 
} 

struct Foo { 
    char a[100]; 
    char b[200]; 
}; 

sizeof(struct Foo); //probably 300. Technically architecture dependent but it will be 
//the # of bytes the compiler needs to make a Foo. 

struct Foo foo; 
sizeof(foo); //same as sizeof(struct Foo) 

struct Foo* fooP; 
sizeof(fooP); //probably 4 or 8 

class ForwardDeclaredClass; 

ForwardDeclaredClass* p; 
sizeof(p); //4 or 8 
ForwardDeclaredClass fdc; //compile time error. Compiler 
//doesn't know how many bytes to allocate 

sizeof(ForwardDeclaredClass); //compile time error, same reason 
+0

Có thể "void foo (char [100] x)" thực ra phải là "void foo (char x [100])"? –

0

Compile thời gian, bởi vì nó tính toán kích thước tại thời gian biên dịch "Compile time" là khi bạn xây dựng mã của bạn - khi trình biên dịch chuyển mã nguồn của bạn vào IL..

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