Tôi muốn khai báo một mảng liên tục có thể được truy cập từ nhiều tệp C và nội dung của trình biên dịch có thể được biên dịch, mà không nhân đôi bộ nhớ trong nhiều đơn vị biên dịch. Hiệu suất là rất quan trọng trong ứng dụng của tôi.Mảng C cố định không thể in không có sự sao chép bộ nhớ
Phụ lục 1:
header.h:
static const int arr[2] = { 1, 2 };
file1.c:
#include "header.h"
void file1() { printf("%d\n", arr[0]); }
file2.c:
#include "header.h"
int file2() { for (int i = 0; i < 2; i++) printf("%d\n", arr[i]); }
Trong trường hợp đó, trình biên dịch có thể thay thế arr[0]
bởi 1
trong file1. Tuy nhiên, vì arr
được khai báo là static const
, bộ nhớ của nó được sao chép trong cả hai tệp C. AFAIK tiêu chuẩn C yêu cầu các địa chỉ mảng phải khác nhau trong cả hai tệp. Tôi đã xác minh điều này dưới Linux bằng cách in ra các địa chỉ. Không có sự hợp nhất liên kết xảy ra ngay cả với -fmerge-all-constants
trong gcc.
Phụ lục 2:
header.h:
extern const int arr[2];
file1.c:
#include "header.h"
void file1() { printf("%d\n", arr[0]); }
file2.c:
#include "header.h"
const int arr[2] = { 1, 2 };
int file2() { for (int i = 0; i < 2; i++) printf("%d\n", arr[i]); }
Trong trường hợp đó, không có sự trùng lặp bộ nhớ xảy ra nhưng arr[0]
không inlined.
Tôi xem phạm vi khả năng hiển thị được xác định theo tiêu chuẩn C là thiếu sót. Như vậy, một giải pháp làm việc dưới Linux/gcc vi phạm tiêu chuẩn C là chấp nhận được với tôi.
Trên thực tế, 'file2' cũng cho phép nội tuyến mảng. 'gcc -O9' bỏ vòng lặp và trực tiếp đẩy hai giá trị. – aschepler
@aschepler: Có. Trên hệ thống của tôi, với -O2, trình biên dịch dừng nội tuyến khi tôi đặt ba hoặc nhiều phần tử trong mảng. –