Chúng ta có thể xem biểu diễn của một đối tượng thuộc loại T
bằng cách chuyển đổi một số T*
trỏ vào đối tượng đó thành một char*
. Ít nhất trong thực tế:Khi nào và chuyển đổi thành con trỏ char được phép như thế nào?
int x = 511;
unsigned char* cp = (unsigned char*)&x;
std::cout << std::hex << std::setfill('0');
for (int i = 0; i < sizeof(int); i++) {
std::cout << std::setw(2) << (int)cp[i] << ' ';
}
này kết quả đầu ra các đại diện của 511
trên hệ thống của tôi: ff 01 00 00
.
Có (chắc chắn) một số hành vi được xác định thực hiện xảy ra ở đây. Mà phôi nào cho phép tôi chuyển đổi một số int*
thành một số unsigned char*
và chuyển đổi nào lấy hàm mũ? Tôi có đang gọi hành vi không xác định ngay sau khi tôi truyền không? Tôi có thể truyền bất kỳ loại T*
nào như thế này không? Tôi có thể dựa vào điều gì khi làm điều này?
Tôi không nghĩ rằng đó là hành vi không xác định, ít nhất là nếu bạn không sửa đổi dữ liệu.Nhưng kết quả sẽ phụ thuộc vào việc bạn có nền tảng là nhỏ hay lớn. – Synxis
Lưu ý rằng điều này chỉ an toàn cho 'char *'. Việc tạo con trỏ để làm cho chúng đọc như các loại khác nhau gây ra các vấn đề với * aliasing *. Các ngôn ngữ C và C++ đảm bảo trình biên dịch trỏ đến các kiểu khác nhau không bao giờ có thể trỏ tới cùng một đối tượng để trình tối ưu hóa có thể thực hiện những việc như lưu trữ giá trị trong sổ đăng ký hoặc nạp một tải hoặc ghi ra khỏi vòng lặp. 'char *' là ngoại lệ duy nhất. Một 'char *' phải được giả định là bí danh với bất cứ điều gì, bởi vì serialization đến và từ đĩa và bộ đệm mạng. –
@ZanLynx - Re "' char * 'là ngoại lệ duy nhất": Không hoàn toàn. Tiêu chuẩn này cũng cho phép chuyển đổi thành 'unsigned char *'. –