首页 > 其他分享 >【C】关于 sizeof 运算符

【C】关于 sizeof 运算符

时间:2022-12-04 00:23:19浏览次数:33  
标签:---- ARR int rbp 运算符 关于 sizeof size

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

相关文章

  • 关于i3-8100安装黑群晖无核显问题
    本人引导是1.04bds918+ 群晖版本6.2.31.操作方法https://www.zxbblog.com/?id=138(需要diskgeniuspro版本,去网上随便下一个)2.补丁下载地址:点我下载 提取码:kox4(DS......
  • 关于分类任务的一些知识点
    对于业务用户来说,希望技术团队完成的是正确分类,区别无分是分成两类还是多类,是一个级别的分类还是多个级别的分类,然后要求准一点。那么什么是准一点呢?也许用户还没有意识到......
  • 【Python】笔记:正确重载运算符
    正确重载运算符一元运算符-(__neg__)+(__pos__)最好返回self的副本~(__invert__)对整数位按位取反(~x==-(x+1))print(~2)-3中辍运算符+fromarray......
  • Astro - 关于某些星到底长什么样子
    变星脉动变星(长周期)造父变星周期造父变星都是已经演化到晚期的红超巨星。星体膨胀到最大时,视向速度最大,星最暗。造父一(仙王座\(\delta\))标准烛光。光变周期\(\rig......
  • 关于学习方向
    最近一直在思考,该如何进行未来职业规划,是坚持在国央企主机厂干下去,还是跳槽干开发。在对主机厂的理解加深的过程中,逐渐发现新能源行业的架构系统,央企日需要控制人员流动,规......
  • 关于C语言 scanf 字符类型时直接跳过问题 出现的原因及解决方案
    问题:如上图所示,问题出现点位于输入多个顶点值ABCDE时,存入的结果为(\nABCD),也就是说,i=0时scanf/这条语句被跳过了,直接执行i=1时的scanf语句。原因:第一次输入时,......
  • 第十五讲 关于计算机网络方案设计分析
    计算机网络方案要求介绍: 计算机网络方案应保罗如下内容: 1.网络背景 2.网络需求 3.网络基本要求 4.网络拓扑结构图 5.网络设备硬件选择 6.网络软件选择 7.网络性能......
  • 关于我
    先说好,这是一些碎碎念。我在几乎所有平台的昵称都是Feyn及其衍生名字(比如在AT,CF,github等平台上由于Feyn被占了,所以我的名字是Feynn),包括QQ,微信,B站(Feyn618)等。稍微......
  • 关于善的思考Maxim
    传奇和故事并非虚伪,而是另一种善的创造真实,远没有传奇那么美丽,而守住一个人的叙事,也总会有,孤独之思不必要的东西,通过传奇剔除事物的真假并不重要,本来就不存在绝对真或绝......
  • 关于mac电脑突然搜不到家里wifi但手机却能连上的问题解决
    今天用mac电脑时,突然遇到一个奇怪的问题,家里wifi用的好好的,突然就连不上了,在看电脑能搜索到的wifi,居然家里的wifi都没有搜索到,但自己的手机却是正常的,然后我再看看我另外......