Có bất kỳ giới hạn kích thước nào đối với cấu trúc C không?Có bất kỳ giới hạn kích thước nào đối với cấu trúc C không?
Trả lời
Từ tiêu chuẩn C:
5.2.4.1 giới hạn dịch
1 Việc thực hiện sẽ có thể dịch và thực hiện ít nhất một chương trình có chứa ít nhất một thể hiện của mỗi người của số giới hạn sau:
... - 65535 byte trong một đối tượng (chỉ trong môi trường được lưu trữ)
... - 1023 thành viên trong một cấu trúc đơn hoặc công đoàn
... - 63 mức độ cấu trúc lồng nhau hoặc định nghĩa công đoàn trong một đơn struct-khai-list ... 13) Triển khai nên tránh áp đặt cố định giới hạn dịch bất cứ khi nào có thể.
Ngoài ra, giới hạn trên là SIZE_MAX
(giá trị lớn nhất cho size_t
).
Vì toán tử sizeof
mang lại kết quả là loại size_t
, giới hạn phải là SIZE_MAX
.
Bạn có thể xác định giá trị của SIZE_MAX
như thế này:
#include <stdint.h>
#include <stdio.h>
int main (void) {
printf("%zu", SIZE_MAX);
return 0;
}
Đây là những gì các trình biên dịch nên cho phép. Môi trường thời gian chạy cho phép là một câu chuyện khác.
Khai báo một đối tượng có kích thước tương tự trên ngăn xếp (cục bộ) trong thực tế sẽ không hoạt động vì ngăn xếp có thể nhiều, nhỏ hơn nhiều so với SIZE_MAX
.
Có một đối tượng như vậy trên toàn cầu có thể khiến trình tải thực thi bị khiếu nại khi khởi động chương trình.
Bạn có thể cho biết giá trị có thể xảy ra của SIZE_MAX không? là nó phụ thuộc vào hệ điều hành? tôi muốn biết giá trị chính xác. – Nemo
Tôi thực sự tò mò về kích thước bạn muốn sử dụng và lý do tại sao. Nói với chúng tôi? – Joe
Ít nhất là về lý thuyết. Trong thực tế, giới hạn là bộ nhớ trong máy tính, nhỏ hơn nhiều so với 'SIZE_MAX' trên máy tính 64-bit hiện đại. –
phân tích thực nghiệm
Trên thực tế, implentations như GCC dường như chỉ cho phép cấu trúc nhỏ hơn size_t
, có lẽ bị ràng buộc bởi PTRDIFF_MAX
. Xem thêm: What is the maximum size of an array in C?
Sử dụng:
for i in `seq 32`; do printf "typedef struct { S$i x; S$i y; } S$(($i+1));\n"; done
Chúng tôi làm cho chương trình:
#include <stdint.h>
#include <stdio.h>
typedef struct { uint8_t i; } S0;
typedef struct { S0 x; S0 y; } S1;
typedef struct { S1 x; S1 y; } S2;
typedef struct { S2 x; S2 y; } S3;
typedef struct { S3 x; S3 y; } S4;
typedef struct { S4 x; S4 y; } S5;
typedef struct { S5 x; S5 y; } S6;
typedef struct { S6 x; S6 y; } S7;
typedef struct { S7 x; S7 y; } S8;
typedef struct { S8 x; S8 y; } S9;
typedef struct { S9 x; S9 y; } S10;
typedef struct { S10 x; S10 y; } S11;
typedef struct { S11 x; S11 y; } S12;
typedef struct { S12 x; S12 y; } S13;
typedef struct { S13 x; S13 y; } S14;
typedef struct { S14 x; S14 y; } S15;
typedef struct { S15 x; S15 y; } S16;
typedef struct { S16 x; S16 y; } S17;
typedef struct { S17 x; S17 y; } S18;
typedef struct { S18 x; S18 y; } S19;
typedef struct { S19 x; S19 y; } S20;
typedef struct { S20 x; S20 y; } S21;
typedef struct { S21 x; S21 y; } S22;
typedef struct { S22 x; S22 y; } S23;
typedef struct { S23 x; S23 y; } S24;
typedef struct { S24 x; S24 y; } S25;
typedef struct { S25 x; S25 y; } S26;
typedef struct { S26 x; S26 y; } S27;
typedef struct { S27 x; S27 y; } S28;
typedef struct { S28 x; S28 y; } S29;
typedef struct { S29 x; S29 y; } S30;
/*typedef struct { S30 x; S30 y; } S31;*/
S30 s;
int main(void) {
printf("%jx\n", (uintmax_t)sizeof(s));
return 0;
}
và sau đó trong Ubunbu 17.10:
$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 7.2.0-6ubuntu1) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ arm-linux-gnueabi-gcc -std=c99 main.c
công trình. Nhưng nếu chúng ta bỏ ghi chú S31
, nó không thành công với:
main.c:35:16: error: type ‘struct <anonymous>’ is too large
typedef struct { S30 x; S30 y; } S31;
Vì vậy, kích thước tối đa là giữa 2^30 và (2^31-1).
Sau đó, chúng ta có thể chuyển đổi S30
tới:
typedef struct { S29 x; S29 y; uint8_t a[(2lu << 29) - 1]; } S30;
và với điều đó chúng tôi xác định rằng kích thước tối đa là thực sự 2^31 - 1 == PTRDIFF_MAX
thi này.
- 1. Đối tượng Ruby có giới hạn kích thước không?
- 2. Giới hạn 2GB đối với kích thước tệp khi sử dụng fwrite trong C?
- 3. Giới hạn kích thước mảng
- 4. C liên kết kích thước cấu trúc
- 5. Có giới hạn về kích thước đối với định dạng .NET Assembly không?
- 6. hàng đợi kích thước giới hạn
- 7. Ghi đè hiển thị của giới hạn kích thước trang/giới hạn kích thước StreamReader?
- 8. Giới hạn kích thước Intent.putExtras?
- 9. Có bất kỳ hạn chế nào với ConcurrentHashMap không?
- 10. Giới hạn kích thước QPage/QPixmap?
- 11. Giới hạn kích thước phản hồi AJAX
- 12. Phiên: giới hạn kích thước phiên
- 13. có phải PHP APC là cửa hàng đối tượng địa phương có bất kỳ giới hạn nào ngoài kích thước lưu trữ không?
- 14. Giới hạn kích thước đối tượng OpenGL FrameBuffer tối đa?
- 15. Giới hạn kích thước tệp SharePoint
- 16. Giới hạn kích thước tham số JSON
- 17. giới hạn kích thước cookie chrome
- 18. C# gọi hàm C trả về cấu trúc với mảng char có kích thước cố định
- 19. Có bất kỳ giới hạn nào về số lượng mẫu khớp với scala không?
- 20. Có giới hạn nào đối với setTimeout không?
- 21. giới hạn kích thước MySQL VARCHAR
- 22. Có bất kỳ bất lợi nào đối với SEAM không?
- 23. Làm cách nào để đối phó với giới hạn kích thước cho Lưu trữ web?
- 24. Lực lượng cụ thể Kích thước cấu trúc trong C
- 25. Giới hạn kích thước Haskell Tuple
- 26. Kích thước của cấu trúc C# này là gì?
- 27. Matrix giới hạn kích thước trong MATLAB
- 28. Có bất kỳ giới hạn nào về các loại trong toán tử định kiểu không?
- 29. MySQL Có giới hạn nào đối với InnerJoin không?
- 30. Kích thước của cấu trúc trong Go
Bạn có nghĩa là kích thước vật lý trong bộ nhớ hoặc số lượng thành viên không? –
Kích thước vật lý trong bộ nhớ. – Nemo
Nếu bạn có xem xét này có thể sử dụng một cấu trúc là cách sai? –