变量的内存存放与作用域

1.变量的声明、定义、初始化

一个程序可由多个源文件实现。

变量可以多次声明,但只能被定义一次。

声明通过extern关键字实现。

extern int i;  //声明

int j;   //定义

2.变量的内存存放

全局变量与局部变量在没有初始化时,取初值的方式不同。前者是全0.

c++内存分为代码、堆、栈、常量和全局//静态存储区。

不同变量的存储位置:

全局/静态存储区——全局变量,static变量;

栈——局部变量、函数调用时的参数。栈的容量一般比较有限;

堆——new运算符分配,需由delete释放;若分配失败,new返回NULL,记得安全性检查。

常量存储区——这是一块比较特殊的存储区,里面存放的是常量。

3.标示符的作用域

 for(int i=0;i<10;i++){//i仅在这里和for小括号内有效} 

c++中大多数作用域都以大括号分隔。

:: 类的作用域分辨符

#include<iostream>
using namespace std;
void show(){cout<<"hello";}
class A{
public:
		static void show(){cout<<"hi ";}
		static void fun(){
			show();  //成员函数
			::show(); //全局函数
		}

};
int main(int argc, char** argv)
{
	A::fun();
	return 0;
}
/*hi hello*/

4.内联函数

函数的调用是有开销的。比如:保存CPU环境、实参到形参的传递、函数执行完返回、恢复CPU环境。而使用inline函数可以达到空间换时间的效果。它告诉编译器把此函数插入到调用的地方去。

关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。 

如下风格的函数Foo 不能成为内联函数: 

inline void Foo(int x, int y); // inline 仅与函数声明放在一起 

void Foo(int x, int y){} 

 

而如下风格的函数Foo 则成为内联函数: 

void Foo(int x, int y); 

inline void Foo(int x, int y) // inline 与函数定义体放在一起{} 

所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。

 

时间: 2024-09-20 22:55:57

变量的内存存放与作用域的相关文章

指针、指针变量与内存空间——解惑

指针.指针变量与内存空间--解惑              一年前,我曾今在ChinaUnix写过一篇博客<关于定义一个指针与指针变量>然后搬家来了CSDN.这篇博客中写道了很多关于指针和指针变量以及空间分配的一些常见错误.但是,到现在为止,无论是CSDN的网友还是一些已经工作的同事以及大三大四的学生,陆陆续续的有人在问我关于指针与指针变量还有空间分配问题.我想在这里再写一篇博客解惑指针     问题1 int idata = 5; int *p = idata//为什么这里不对? 既然通常*

C语言中变量与其内存地址对应的入门知识简单讲解_C 语言

先来理解理解内存空间吧.请看下图: 如上图所示,内存只不过是一个存放数据的空间,就好像我的看电影时的电影院中的座位一样.电影院中的每个座位都要编号,而我们的内存要存放各种各样的数据,当然我们要知道我们的这些数据存放在什么位置吧.所以内存也要象座位一样进行编号了,这就是我们所说的内存编址.座位可以是遵循"一个座位对应一个号码"的原则,从"第1号"开始编号.而内存则是按一个字节接着一个字节的次序进行编址,如上图所示.每个字节都有个编号,我们称之为内存地址.好了,我说了这

jsp-在JSP中能不能将一个表中的数据全部存放到作用域里然后在页面上有选择性的显示

问题描述 在JSP中能不能将一个表中的数据全部存放到作用域里然后在页面上有选择性的显示 在页面中可不可以通过判断让他满足某个条件是显示相应的数据 解决方案 你说的有选择的显示是根据条件查询呢,还是根据页面选择需要展示的数据列,然后再展示数据(类似数据库客户端的隐藏/显示某些列的数据呢? 前者就是条件查询,后者实现时可以让页面选择展示列名称,后台sql查询相应的列再进行数据展示. 解决方案二: 使用JSTL的c:if中的一个标签 例子<c:if test="${1<2}"&g

浅析C/C++变量在内存中的分布_C 语言

C/C++变量在内存中的分布在笔试时经常考到,虽然简单,但也容易忘记,因此在这作个总结,以加深印象. 先写一个测试程序: 复制代码 代码如下: #include <stdio.h>  #include <malloc.h>  int g_i = 100;  int g_j = 200;  int g_k, g_h;  int main()  {      const int MAXN = 100;      int *p = (int*)malloc(MAXN * sizeof(i

变量的 声明、存放与作用域

变量声明 终极基类.java中所有的类最终都继承自单一的基类--Object. 向上转型:子类转换为基类.向下转型与之相反.注意:无论怎么转,都是声明类型互转,运行时类型是自始至终不会变的! String str; //只是创建引用,并没有创建对象. 变量存放 寄存器 c++可以向编译器建议变量存放在寄存器中.而java不能. 栈(一些书称为"堆栈") 位于内存中.创建的引用位于栈中. 堆 位于内存中.java所有对象都存在这里. 代码段 代码与常量. 非RAM(即内存) 基本的例子是

浅析JavaScript中的变量复制、参数传递和作用域链_javascript技巧

今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执行环境.变量对象.作用域链. 1.变量 变量需要注意的有两点:变量声明和复制变量值. 变量声明肯定大家都很熟悉,在JS中我们都是通过 var 关键字进行变量声明的.JS中规定,通过var声明的变量会被添加到最近的环境中,如果声明并且初始化一个变量没有用到var关键字,这个变量会被添加到全局环境中.

语言变量声明内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.程序结束时由编译器自动释放. 2.堆区(heap) - 在内存开辟另一块存储区域.一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(static)-编译器编译时即分配内存.全局变量和静态变量的存储是放在一块的,初始化的全局

C/C++变量在内存中的存储

在C++语言中,有如下代码: char a; int b; int c; a='1'; b=1; printf("a = %x \r\n",a); printf("b = %x\r\n",b); c=a; printf("c = %x\r\n",c); 输出的结果是 a = 31 b = 1 c = 31 请按任意键继续. . . 这里 int型是4Byte char型是1Byet. a='1' 这条语句执行后,会在内存中分配1个字节大小的内存空

PHP中使用unset销毁变量并内存释放问题_php技巧

复制代码 代码如下: for ( $i = 1; $i < 100; $i++ ) { $str = str_repeat('01234567', $i); $a = memory_get_usage(); unset($str); $b = memory_get_usage(); echo "\n ".$i.': '.($b - $a).' Bytes.'; } 从结果看出: 8 x 32 = 256 在256字节长的时候才真正有必要释放内存,有些人说,不如直接$str = n