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. iptables详解(6):iptables扩展匹配条件之’–tcp-flags’

    如果你看过前文,那么你一定知道,前文已经对"tcp扩展模块"做过总结,但是只总结了tcp扩展模块中的"--sport"与"--dport"选 ...

  2. Hibernate入门1. Hibernate基础知识入门

    Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...

  3. pdi vcard-2.1

    vCard The Electronic Business Card Version 2.1 A versit Consortium Specification September 18, 1996 ...

  4. jsp页面图片显示不出来

    jsp页面就是MyJsp.jsp <body> This is my JSP page. <br> <img src="img/top.jpg"> ...

  5. Android程序员学WEB前端(7)-CSS(2)-伪类字体文本背景边框-Sublime

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76618373 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 伪类: <!DOC ...

  6. VMWare的共享文件的安装指南

    引言:笔者这几天基于CentOS 7的精简版按照了一个虚拟机,悲催的是没有图形界面,但是非常需要共享文件的工作,在宿主机以及虚拟机之间实现文件共享,本文将描述如何实现此操作. VMWare菜单按照VM ...

  7. iOS开发之如何在Xcode中显示断点堆栈

    昨天有人问我在Xcode中打断点后怎么查看堆栈,今天就简单的聊聊. 首先解释一下,什么是堆栈? 堆:顺序随意:栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式 ...

  8. mongodb 使用

    一.下载 MongoDB的官网是:http://www.mongodb.org/ MongoDB最新版本下载在官网的DownLoad菜单下:http://www.mongodb.org/downloa ...

  9. iOS-Core Data 详解

    使用Core Data 框架 Core Data框架本质就是一个ORM(对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一 ...

  10. caffe 细节

    batch :http://www.zhihu.com/question/32673260 caffe blog: http://blog.csdn.net/abcjennifer/article/d ...