sizeof 的实现还是比较巧妙地 :
// 如果对象是数组 #define sizeof(ARR) ( (size_t)(&ARR + 1) - (size_t)(&ARR) )
我们都知道 :
int x = 0; short y = 0; x ++; // x = 1 y ++; // y = 1
做这种加减法, 数字会被自动转换成编译器认为你需要的类型, 这是为了让你在不同的数据类型下计算, 仍能得到符合数学逻辑的结果.
我们数组计算也一样 :
假设我们有int ARR [2][3] = { {1,2,3}, {4,5,6} };
ARR[0][0] + 1 ----加1----> 2
&ARR[0][0] + 1 ----加了一个ARR[ ][ ] ----> 0x叽里呱啦 + 4 * 1
&ARR[0] + 1 ----加了一个ARR[ ] ----> 0x叽里呱啦 + 4 * 3
&ARR + 1 ----加了一个ARR ----> 0x叽里呱啦 + 4 * 6
" (size_t)(&ARR + 1) - (size_t)(&ARR) "就是先假装加上自己的大小,然后再剪掉, 就知道自己的大小了
至于size_t, 你可以改成其他类型诸如int short 甚至char. 它可以防止编译器优化 : 直接把首尾的&ARR去掉
#include <stdlib.h> int main() { size_t arr[1] = {0}; <-------- 如果改成 size_t arr[2] = {0}; int b0 = &arr; int b = (size_t)(&arr + 1); int c = (size_t)(&arr); }
main: push rbp mov rbp, rsp mov QWORD PTR [rbp-24], 0 lea rax, [rbp-24] mov DWORD PTR [rbp-4], eax lea rax, [rbp-24] add rax, 8 <---------- 加1从把8放进rax 变成 把16放进rax mov DWORD PTR [rbp-8], eax lea rax, [rbp-24] mov DWORD PTR [rbp-12], eax mov eax, 0 pop rbp ret
标签:----,ARR,int,rbp,运算符,关于,sizeof,size From: https://www.cnblogs.com/realHarvey/p/16949039.html