Từ ANSI-ISO-IEC 14882-2003, tr.87 (C++ 03):
"75) Một cách khác để tiếp cận con trỏ số học là đầu tiên để chuyển đổi con trỏ (s) để con trỏ ký tự (s): Trong Đề án này giá trị không thể thiếu của biểu thêm vào hoặc trừ vào con trỏ chuyển đổi là lần đầu tiên nhân với kích thước của đối tượng ban đầu chỉ vào, và dẫn con trỏ được chuyển đổi trở lại loại ban đầu. Đối với con trỏ trừ, kết quả của sự khác biệt giữa các ký tự poin ters tương tự được chia cho kích thước của đối tượng ban đầu chỉ được . "
Điều này dường như gợi ý rằng sự khác biệt con trỏ bằng với kích thước đối tượng.
Nếu chúng ta loại bỏ các UB'ness từ incrementing một con trỏ đến một vô hướng a và biến thành một mảng:
int a[1];
size_t size_of_int = (char*)(a+1) - (char*)(a);
std::cout<<size_of_int;// or printf("%zu",size_of_int);
Sau đó, điều này có vẻ OK. Các mệnh đề về yêu cầu căn chỉnh phù hợp với chú thích, nếu yêu cầu căn chỉnh luôn chia hết cho kích thước của đối tượng.
CẬP NHẬT: Thú vị. Như hầu hết các bạn có thể biết, GCC cho phép chỉ định một sự liên kết rõ ràng với các kiểu như một phần mở rộng. Nhưng tôi không thể phá vỡ phương pháp "sizeof" của OP với nó vì GCC từ chối biên dịch nó:
#include <stdio.h>
typedef int a8_int __attribute__((aligned(8)));
int main()
{
a8_int v[2];
printf("=>%d\n",((char*)&v[1]-(char*)&v[0]));
}
Thư này là error: alignment of array elements is greater than element size
.
Nguồn
2010-08-02 11:13:54
di động với những gì? int không phải là nền tảng độc lập và có ý nghĩa khác trong các hệ thống 64bit. Mặc dù C++ của tôi có lẽ là quá gỉ vì điều này. – Blub
@Blub: Ý tôi là kích thước in mã luôn luôn ở trên (int) (ví dụ: 4 trên môi trường 32 bit điển hình)? –
cho các hồ sơ, bạn có thể vui lòng chọn một tiêu đề phù hợp cho câu hỏi của bạn? cái gì đó ít nhất đề cập đến số học con trỏ. cảm ơn –