1.动机:前段时间,一直有个疑问,就是编译器是从哪里知道数据的类型的,数据的类型是存在内存里面的么,因为自己调试编译器,发现内存中并没有多余的数据,后来在群上发问,才知道数据在编译成汇编的过程就知道数据的类型了,也就是数据的类型识别时在内存代码区里

  观察代码

#include<stdio.h>
#include<string.h> struct data{
short a;
long b;
long long c;
float e;
double f;
double g;
bool h;
char i;
}; int main(){ data temp;
temp.a=;
temp.b=;
temp.c=;
temp.e=;
temp.f=;
temp.g=;
temp.h=;
temp.i=;
}

在汇编里

    data temp;
temp.a=;
004113BE mov eax,
004113C3 mov word ptr [temp],ax
temp.b=;
004113C7 mov dword ptr [ebp-30h],
temp.c=;
004113CE mov dword ptr [ebp-2Ch],
004113D5 mov dword ptr [ebp-28h],
temp.e=;
004113DC fld dword ptr [__real@ (41575Ch)]
004113E2 fstp dword ptr [ebp-24h]
temp.f=;
004113E5 fld qword ptr [__real@ (415750h)]
004113EB fstp qword ptr [ebp-1Ch]
temp.g=;
004113EE fld qword ptr [__real@ (415740h)]
004113F4 fstp qword ptr [ebp-14h]
temp.h=;
004113F7 mov byte ptr [ebp-0Ch],
temp.i=;
004113FB mov byte ptr [ebp-0Bh],
}

可以明显观察到short是word,int 是dword,long long是dword。。。

但是,问题又来了,int 与float都是dworld,char与bool都是byte,这个咋区分?

2.sizeof

  本来一直以为sizeof也是个函数,现在才知道sizeof是个关键字

  在汇编中的时候,sizeof就直接赋值了

    int len=sizeof(temp);
 0041143F mov dword ptr [len],30h

3.sizeof的宏实现

  可以利用指正ptr 与(ptr+1)的内存偏移量来求类型或是变量的内存占用量

  

//变量类型类型
#define _sizeof(T) (size_t)((T*)0 + 1)
//变量或是数组名
#define array_sizeof(T) ( (size_t)(&T+1) - (size_t)(&T) )

到了这时,以为问题解决了吗?才不是,继续探究指针重载++符号的原理是什么?

从汇编的角度看待变量类型与sizeof的机制的更多相关文章

  1. 从汇编的角度看待const与#define

    先观察一下的代码: #include<stdio.h> int main(){ ; int y; int *pi=(int*)&i; *pi=; y=*pi; int tempi; ...

  2. CUDA1.1-函数类型限定符与变量类型限定符

    这部分来自于<CUDA_C_Programming_Guide.pdf>,看完<GPU高性能变成CUDA实战>的第四章,觉得这本书还是很好的,是一种循序渐进式的书,值得看,而不 ...

  3. python(1)-- 变量类型

    常规: Python有五个标准的数据类型: Numbers(数字):数字数据类型用于存储数值.他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象.String(字符串):由数字.字母 ...

  4. [Python3] 003 变量类型概述 & 数字类型详叙

    目录 0. 变量类型概述 1. 数字类型详叙 1.1 整数 1.1.1 常用进制 1.1.2 少废话,上例子 1.2 浮点数 1.2.1 使用浮点数时可以"偷懒" 1.2.2 科学 ...

  5. C的变量类型、作用域与生命周期的总结

    C的变量类型.作用域与生命周期的总结 最近在看"C Programing Language" (Kernighan, Ritchie)关于外部变量的讨论,之前在学C的时候对这些ex ...

  6. 从安全的角度看待DNS

    以前对DNS(Domain Name System)认识就大概的知道是一个提供域名解析服务,作为互联网的基础设施,任何一个IT人员都会或多或少都接触到DNS,随着我最近的接触不断提高,我发现DNS还是 ...

  7. [啃书] 第1篇 - 输入输出/变量类型/math函数

    啃书部分已单独做成Gitbook了,后续不再更新.详情访问个人网站ccoding.cn或ccbyte.github.io 说在前面 一直想刷算法找不到很适合的书,后来发现考PAT很多推荐<算法笔 ...

  8. Python学习--03变量类型

    变量赋值 Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创 ...

  9. 5-2 bash 脚本编程之一 变量、变量类型等

    1. bash变量类型 1. 环境变量 2. 本地变量(局部变量) 3. 位置变量 4. 特殊变量 2. 本地变量 VARNAME=VALUE, 整个bash进程 3. 环境变量 作用域为当前shel ...

随机推荐

  1. Srping整合EhCache

    引入的Jar包如下:

  2. Friendly Date Ranges

    让日期区间更友好! 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推 ...

  3. CSS样式--移动划过超链接鼠标变手型详解

    用css控制鼠标样式的语法如下:<span style="cursor:*">文本或其它页面元素</span>把 * 换成如下15个效果的一种: 下面是对这 ...

  4. 自研发RPC调用框架

    自主研发设计RPC远程调用框架,实现服务自动注册,服务发现,远程RPC调用,后续实现服务负载均衡 主要包括:客户端服务,服务端,服务发现,服务注册 github地址:https://github.co ...

  5. C++设计模式之-工厂模式的总结

    工厂模式分为3种,即简单工厂模式.工厂方法模式.抽象工厂模式,其实大同小异,总结下来就是: 简单工厂模式:一个工厂,多个产品.产品需要有一个虚基类.通过传入参数,生成具体产品对象,并利用基类指针指向此 ...

  6. android mvp RxJava 框架结构分析

    一个MVP结构:M是model,V是Fragment,P是提供者,P持有V和Model,控制获取数据并给V赋值.(结合了RXJava Retrofit和okHttp)

  7. linkbutton组件

    可独立存在的组件. inkbutton 按钮组件 通过$.fn.linkbutton.defaults重写默认的defaults链接按钮(linkbutton)用于创建一个超链接按钮.它是一个正常的& ...

  8. Javascript-- jQuery动画篇(淡入淡出效果)

    淡入淡出效果 jQuery 提供了下面几种方法可以实现显示的淡入淡出效果: fadeIn() fadeOut() fadeToggle() fadeTo() fadeIn()方法 fadeIn()实现 ...

  9. 微信小程序视频教程

    微信小程序全套视频教程在线观看地址:http://v.qq.com/vplus/92e0ff1abe80fce5bcfe344f11a106c5/foldervideos/hod000101p9le1 ...

  10. android代码常识

    查看当前android代码版本号:build/core/version_defaults.mk---->查找platform_version android源码在线阅读网址 http://and ...