从汇编的角度看待变量类型与sizeof的机制
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的机制的更多相关文章
- 从汇编的角度看待const与#define
先观察一下的代码: #include<stdio.h> int main(){ ; int y; int *pi=(int*)&i; *pi=; y=*pi; int tempi; ...
- CUDA1.1-函数类型限定符与变量类型限定符
这部分来自于<CUDA_C_Programming_Guide.pdf>,看完<GPU高性能变成CUDA实战>的第四章,觉得这本书还是很好的,是一种循序渐进式的书,值得看,而不 ...
- python(1)-- 变量类型
常规: Python有五个标准的数据类型: Numbers(数字):数字数据类型用于存储数值.他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象.String(字符串):由数字.字母 ...
- [Python3] 003 变量类型概述 & 数字类型详叙
目录 0. 变量类型概述 1. 数字类型详叙 1.1 整数 1.1.1 常用进制 1.1.2 少废话,上例子 1.2 浮点数 1.2.1 使用浮点数时可以"偷懒" 1.2.2 科学 ...
- C的变量类型、作用域与生命周期的总结
C的变量类型.作用域与生命周期的总结 最近在看"C Programing Language" (Kernighan, Ritchie)关于外部变量的讨论,之前在学C的时候对这些ex ...
- 从安全的角度看待DNS
以前对DNS(Domain Name System)认识就大概的知道是一个提供域名解析服务,作为互联网的基础设施,任何一个IT人员都会或多或少都接触到DNS,随着我最近的接触不断提高,我发现DNS还是 ...
- [啃书] 第1篇 - 输入输出/变量类型/math函数
啃书部分已单独做成Gitbook了,后续不再更新.详情访问个人网站ccoding.cn或ccbyte.github.io 说在前面 一直想刷算法找不到很适合的书,后来发现考PAT很多推荐<算法笔 ...
- Python学习--03变量类型
变量赋值 Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创 ...
- 5-2 bash 脚本编程之一 变量、变量类型等
1. bash变量类型 1. 环境变量 2. 本地变量(局部变量) 3. 位置变量 4. 特殊变量 2. 本地变量 VARNAME=VALUE, 整个bash进程 3. 环境变量 作用域为当前shel ...
随机推荐
- iptables详解(6):iptables扩展匹配条件之’–tcp-flags’
如果你看过前文,那么你一定知道,前文已经对"tcp扩展模块"做过总结,但是只总结了tcp扩展模块中的"--sport"与"--dport"选 ...
- Hibernate入门1. Hibernate基础知识入门
Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...
- pdi vcard-2.1
vCard The Electronic Business Card Version 2.1 A versit Consortium Specification September 18, 1996 ...
- jsp页面图片显示不出来
jsp页面就是MyJsp.jsp <body> This is my JSP page. <br> <img src="img/top.jpg"> ...
- Android程序员学WEB前端(7)-CSS(2)-伪类字体文本背景边框-Sublime
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76618373 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 伪类: <!DOC ...
- VMWare的共享文件的安装指南
引言:笔者这几天基于CentOS 7的精简版按照了一个虚拟机,悲催的是没有图形界面,但是非常需要共享文件的工作,在宿主机以及虚拟机之间实现文件共享,本文将描述如何实现此操作. VMWare菜单按照VM ...
- iOS开发之如何在Xcode中显示断点堆栈
昨天有人问我在Xcode中打断点后怎么查看堆栈,今天就简单的聊聊. 首先解释一下,什么是堆栈? 堆:顺序随意:栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式 ...
- mongodb 使用
一.下载 MongoDB的官网是:http://www.mongodb.org/ MongoDB最新版本下载在官网的DownLoad菜单下:http://www.mongodb.org/downloa ...
- iOS-Core Data 详解
使用Core Data 框架 Core Data框架本质就是一个ORM(对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一 ...
- caffe 细节
batch :http://www.zhihu.com/question/32673260 caffe blog: http://blog.csdn.net/abcjennifer/article/d ...