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