20140319 const sizeof define 编译时分配内存
1、面试宝典预处理,const,sizeof
Define作用定义函数:
//用一个宏定义FIND求一个结构体struc里某个变量相对于struc的偏移量,如FIND(student,a)//等于0 FIND(student,b)//等于4
#include<stdio.h>
#define FIND(strucrr,e) (unsigned int)&(((strucrr *)0)->e)
struct student
{
double ccc;
int a;
char b;
}; int main()
{
struct student A;
printf("ccc的偏移地址为:%d\n",FIND(student,ccc));
printf("a的偏移地址为:%d\n",FIND(student,a));
printf("b的偏移地址为:%d\n",FIND(student,b));
printf("成员1地址:%x\n",&(A.ccc));
printf("成员2地址:%x\n",&(A.a));
printf("成员3地址:%x\n",&(A.b));
printf("结构体变量A所占内存%d\n",sizeof(A)); //结构体变量A所占内存空间始终大于结构的大小,原因是因为内存对齐
return 0;
}
若出现以下错误,解决方案是:在项目属性->配置属性->清单工具->输入输出嵌入清单该“是”为“否”,即可解决问题

结果如下所示:

#include<stdio.h>
#define MIN(A,B) (A>B?B:A)
void main()
{
int A=2;
int B=1;
printf("%d",MIN(A,B));
}
cosnt
关于书上说的“编译的时候分配内存” :http://www.cnblogs.com/helinsen/archive/2012/10/02/2710460.html
const作用http://blog.csdn.net/gulin20475/article/details/6747660
include和extern的关系
两种情况下:左边const相当于define,不分配内存,编译器经过类型检查后直接用100在编译时替换;右边是普通变量,分配内存;加extern就会分配内存



const变量默认是内部部链接,普通变量默认是外部链接
//test.cpp
#include<stdio.h>
const int r=100; //1处:普通变量默认就是extern,但是const是默认内部链接的,如果要外部连接必须加上extern
extern void print();
void main()
{
print();
} test1.cpp
#include<stdio.h>
extern int r;//2处
extern void print()
{
printf("%d",r);
}
会在链接时出现以下错误(编译正确):原因就是普通变量默认就是extern,但是const是默认内部链接的,如果要外部引用必须加上extern

所以1处修改为:extern const int r;同样会出现以上错误,这次的原因就在于2处的extern int r没加const。接着修改2处为extern const int r;成功!
cost 引用

什么情况下不能重载,什么情况下不能重载?
void f(int i) {......} file://一个函数
void f(int i) const {......} file://上一个函数的重载
关于函数overloading, 不能根据返回值类型来确定
double max( int a, int b);
int max( int a, int b);
也不能根据参数的默认值来判断
int max( int a, int b);
int max( int a, int b, int c=12);
const成员函数:
它的声明形如:
int f( ) const;//const放在函数的最后,编译器会对这个函数进行检查,在这个函数中的任何试图改变成员变量和调用非const成员函数的操作都被视为非法
//假如有一个叫做X的类,它有一个int成员变量r,我们需要通过一个const成员函数f( )来对这个r进行++r操作,代码如下
void X::f( ) const
{ (const_cast<X*>(this)) -> ++r; } //通过this指针进行类型强制转换实现
另外一种方法就是使用关键字:mutable。如果你的成员变量在定义时是这个样子的:
mutable int r ;
那么它就告诉编译器这个成员变量可以通过const成员函数改变。编译器就不会再理会对他的检查了。
20140319 const sizeof define 编译时分配内存的更多相关文章
- C语言中的编译时分配内存
1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等: 2.堆区(heap) --由程序员分配释放: 3.全局区或静态区 --存放全局变量和静态变量:程序结束时由系统释放 ...
- mdk编译时的内存分析
内存四区(代码区,全局区,栈区,堆区) Code:即代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区. RO-data:Read Only data,即只读数据域,它指程序中用到的只读数 ...
- 记一次因为Gradle与Lombok不兼容导致编译时的内存溢出 Expiring Daemon because JVM heap space is exhausted
1.现象 版本 Gradel:6.1.1 / 6.5.1 Lombok:1.8.6 / 1.8.10 截图 解决过程 调大idea的堆内存 不行 × idea安装目录中找到 idea64.exe.vm ...
- 自制编程语言crowbar(v0.1)构建解析器时分配内存
crowbar中第一次申请内存是在生成解析器的时候: /* interface.c */CRB_Interpreter *CRB_create_interpreter(void) { MEM_Stor ...
- 问题-Delphi2007编译时提示内存错误“sxs.dll. No Debug Info.ACCESS 0xXXXXX"
相关资料:http://bbs.csdn.net/topics/340132341 问题现象:在调试程序时,未进工程文件中的TApplication.Run;证明不是代码问题. 问题原因:可能是因为* ...
- 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等
今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...
- c++ 程序编译后运行时的内存分配
程序编译后运行时的内存分配 太好的文章了,看到不得不转,转自:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html 一.编译时与运行时的内存情况 1 ...
- QT编译时 cc1plus进程占用大量内存卡死问题解决
QT5.7 做一个demo编译时,内存几乎完全消耗,卡死.经尝试发现是添加资源文件过大导致(不知是单个文件过大触发还是文件总共过大触发)的.我的资源文件工136M,单个最大是125M左右. 解决方法是 ...
- Linux设备驱动程序学习之分配内存
内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...
随机推荐
- AngularJS 指令实践指南(一)
指令(Directives)是所有AngularJS应用最重要的部分.尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令.这篇教程会为你讲述如何自定义指令,以及介绍如何在 ...
- 【前端技术】一篇文章搞掂:CSS
Flex布局 Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性. /*父容器,设置弹性布局*/ .parent{display: flex;} /*设置父容器主轴方向* ...
- MProtect使用小计【三】 – 权限管理
说明 本篇简单的说一下怎么样使用的VMProtect的权限管理功能,使我们的程序拥有注册码的功能.只用的注册版的程序才能执行指定的函数. 同样这个功能VMProtect也有例子位置在:安装目录\VMP ...
- 浅谈虚拟机、Docker和Hyper技术
操作系统 我们知道: 完整的操作系统=内核+apps 内核负责管理底层硬件资源,包括CPU.内存.磁盘等等,并向上为apps提供系统调用接口,上层apps应用必须通过系统调用方式使用硬件资源,通常并不 ...
- 词表征 1:WordNet、0-1表征、共现矩阵、SVD
原文地址:https://www.jianshu.com/p/c1e4f42b78d7 一.基于知识的表征 参见图1.1,WordNet中包含同义词集(synonym sets)和上位词(hypern ...
- HTML中改变列表的序号类型
HTML中,<ol>标签表示有序列表,每一个表项的编号默认从数字开始.比如 <html> <head> <title>test</title> ...
- ros语音交互(五)移植科大讯飞语音识别到ros
将以前下载的的语音包的 samples/iat_record/的iat_record.c speech_recognizer.c speech_recognizer.c 拷贝到工程src中, linu ...
- dev 中 字符串转中文拼音缩写,对grid列表进行模糊匹配,grid获取焦点行,gridlookupedit控件用拼音模糊匹配下拉选项
番外篇:. //该方法是将字符串转化为中文拼音的首写字母大写, public static string RemoveSpecialCharacters(string str){try{if (str ...
- 关于mysql的权限的问题
昨天因为同学的mysql数据库不知道做了什么操作,从而导致root用户无法使用了 具体是使用root用户不需要密码 进去只能看 看到 infomation_schema 表 ,感觉root权限丢失了 ...
- Batch - forfiles 命令详解
forfiles 命令详解 C:\Users\cuixunxu>forfiles /? FORFILES [/P pathname] [/M searchmask] [/S] [/C comma ...