Theo như tôi biết trong C++ cấu trúc/lớp thành viên với cùng một điều khiển truy cập được lưu trữ trong bộ nhớ theo thứ tự khai báo. Là ví dụ tiếp theo m
và c
nên được lưu trữ một sau khi khác:Thành viên có thể thay đổi không cho phép tối ưu hóa const cho các thành viên không thể thay đổi không?
#include <cstdlib>
#include <iostream>
struct X
{
mutable int m;
int c;
};
const X cx = {0, 1};
int main()
{
X& x = const_cast<X&>(cx);
x.m = rand();
x.c = rand();
std::cout<<x.m<<" "<<x.c;
}
Trong ví dụ này, chương trình chạy và in 2 số ngẫu nhiên. Nếu tôi xóa mutable
lỗi này sẽ bị treo vì cx
được lưu trữ trong bộ nhớ được bảo vệ chỉ đọc.
Điều này làm tôi ngạc nhiên - không một thành viên mutable
vô hiệu hóa const
tối ưu hóa cho toàn bộ struct
(bằng cách nào đó khiến tất cả thành viên mutable
)?
Có thể lưu trữ các bộ phận của struct
trong bộ nhớ chỉ đọc và các bộ phận khác trên bộ nhớ không đọc và tôn trọng bố cục bộ nhớ tiêu chuẩn C++ không?
Điều này đã được thử nghiệm bằng Visual Studio 2010 trên Windows 7 và GCC 4.7.2 trên Ubuntu.
Tôi thêm X() constructor mà inits m và c và cx không có trong bộ nhớ chỉ đọc như trước đây. Cái nhìn rất thú vị, cảm ơn! – Felics