Trong một số trường hợp, như mô tả, C ++ Standard cho phép trình biên dịch xử lý các cấu trúc theo bất kỳ cách nào mà khách hàng của họ sẽ thấy hữu ích nhất, mà không yêu cầu hành vi đó có thể dự đoán được. Nói cách khác, các cấu trúc như vậy gọi "Hành vi không xác định". Tuy nhiên, điều đó không ngụ ý rằng các cấu trúc như vậy có nghĩa là "bị cấm" vì Tiêu chuẩn C ++ rõ ràng khước từ quyền tài phán đối với những chương trình được hình thành tốt được "cho phép". Mặc dù tôi không biết về bất kỳ tài liệu Cơ sở lý luận nào được công bố cho Tiêu chuẩn C ++, nhưng thực tế là nó mô tả Hành vi không xác định giống như C89 sẽ cho thấy ý nghĩa dự định là tương tự: "Hành vi không xác định cho phép người thực hiện không gặp phải một số lỗi chương trình nhất định. để chẩn đoán.
Có nhiều tình huống trong đó cách hiệu quả nhất để xử lý một cái gì đó sẽ liên quan đến việc viết các phần của cấu trúc mà mã hạ nguồn sẽ quan tâm, trong khi bỏ qua những thứ mà mã hạ nguồn sẽ không quan tâm. Yêu cầu các chương trình khởi tạo tất cả các thành viên của một cấu trúc, bao gồm cả những chương trình mà không có gì sẽ quan tâm, sẽ không cần thiết cản trở hiệu quả.
Hơn nữa, có một số tình huống có thể hiệu quả nhất khi có dữ liệu chưa được xử lý theo cách không xác định. Ví dụ: đã cho:
struct q { unsigned char dat[256]; } x,y;
void test(unsigned char *arr, int n)
{
q temp;
for (int i=0; i<n; i++)
temp.dat[arr[i]] = i;
x=temp;
y=temp;
}
nếu mã xuôi dòng không quan tâm đến các giá trị của bất kỳ yếu tố nào x.dat
hoặc y.dat
có chỉ số không được liệt kê trong đó arr
, mã có thể được tối ưu hóa thành:
void test(unsigned char *arr, int n)
{
q temp;
for (int i=0; i<n; i++)
{
int it = arr[i];
x.dat[index] = i;
y.dat[index] = i;
}
}
Sự cải thiện hiệu quả này sẽ không thể thực hiện được nếu các lập trình viên được yêu cầu viết rõ ràng mọi yếu tố của temp.dat
, kể cả những người hạ lưu sẽ không quan tâm, trước khi sao chép nó.
Mặt khác, có một số ứng dụng rất quan trọng để tránh khả năng rò rỉ dữ liệu. Trong các ứng dụng như vậy, có thể có một phiên bản mã được sử dụng để bẫy bất kỳ nỗ lực nào để sao chép bộ nhớ chưa được khởi tạo mà không cần quan tâm đến việc liệu mã hạ nguồn có nhìn vào nó hay không, có thể hữu ích để đảm bảo việc thực hiện lưu trữ có nội dung có thể bị rò rỉ sẽ bị xóa hoặc ghi đè lên dữ liệu không bảo mật.
Từ những gì tôi có thể nói, Tiêu chuẩn C ++ không cố gắng nói rằng bất kỳ hành vi nào trong số này là đủ hữu ích hơn các hành vi khác để biện minh cho việc bắt buộc nó. Trớ trêu thay, việc thiếu đặc tả này có thể nhằm tạo điều kiện tối ưu hóa, nhưng nếu các lập trình viên không thể khai thác bất kỳ loại đảm bảo hành vi yếu nào, mọi tối ưu hóa sẽ bị từ chối.