C++中函数中的局部变量到底是不是执行到变量定义处才分配内存吗,为什么我用VS调试有疑问
我一直认为C++代码在函数中是顺序执行的,直道今天调试的时候发现一个问题,如图:程序断点调试还没有执行第9行,局部变量中已经有b这个变量了,此时第十行代码还没有执行啊,怎...
我一直认为C++代码在函数中是顺序执行的,直道今天调试的时候发现一个问题,如图:
程序断点调试还没有执行第9行,局部变量中已经有b这个变量了,此时第十行代码还没有执行啊,怎么会有b的存在呢?实事上刚一进入main函数,b变量就存在了,难道说我以前认为的都是错的?在C语言中,局部变量都是函数刚一进入就全部分配了内存而不论变量实际定义的代码在第几行?
但是为什么eclipse调试java代码就不同呢?如下图:
JAVA中程序还没执行12行之前(此时准备执行,还没有执行),局部变量里只有字符串args和a,并没有b,所以我想问C和JAVA在程序执行流程上有如此大的不同?还是说VS中仅仅是把局部变量一口气全写出来,而并不是意味着在执行第7行之前,变量int b已经存在在内存中了(仅仅是因为VS这个IDE的问题)? 展开
程序断点调试还没有执行第9行,局部变量中已经有b这个变量了,此时第十行代码还没有执行啊,怎么会有b的存在呢?实事上刚一进入main函数,b变量就存在了,难道说我以前认为的都是错的?在C语言中,局部变量都是函数刚一进入就全部分配了内存而不论变量实际定义的代码在第几行?
但是为什么eclipse调试java代码就不同呢?如下图:
JAVA中程序还没执行12行之前(此时准备执行,还没有执行),局部变量里只有字符串args和a,并没有b,所以我想问C和JAVA在程序执行流程上有如此大的不同?还是说VS中仅仅是把局部变量一口气全写出来,而并不是意味着在执行第7行之前,变量int b已经存在在内存中了(仅仅是因为VS这个IDE的问题)? 展开
1个回答
展开全部
C语言C++语言的局部非静态变量或者局部非静态对象在函数开始执行的时候就分配好了内存空间,但是在到达对象或者变量的定义点之前,是不能对其进行引用的。对于局部非静态对象,构造函数只有到定义点才调用。这些都是实现细节,不是C++标准定义的,所以不同的编译器和系统可能有所不同的实现。在C++语言中,一个对象只有调用了构造函数之后才算真正的创建完成,所以即使内存提前分配,但是对象依然还没有完成创建。
Java语言和C++语言本质上不一样:一个是解释型语言、一个是编译型语言。C++语言经过编译之后直接生成CPU可以直接处理的机器指令,而java语言需要首先编译成某个中间语言,执行的时候再由解释器一步一步解释。所以C++语言编写的程序在编译时就可以直接进行优化,比如对于函数的局部变量,因为个数确定、类型确定,所以可以直接在函数的开头生成分配容纳所有局部变量的内存空间的指令(通常是一个修改栈顶的指令),执行一个指令总比执行多个分开的指令要快得多。
你用的Visual Studio,在调试模式下分配给局部变量的内存会大很多,这是用于检测堆栈异常的。
Java语言和C++语言本质上不一样:一个是解释型语言、一个是编译型语言。C++语言经过编译之后直接生成CPU可以直接处理的机器指令,而java语言需要首先编译成某个中间语言,执行的时候再由解释器一步一步解释。所以C++语言编写的程序在编译时就可以直接进行优化,比如对于函数的局部变量,因为个数确定、类型确定,所以可以直接在函数的开头生成分配容纳所有局部变量的内存空间的指令(通常是一个修改栈顶的指令),执行一个指令总比执行多个分开的指令要快得多。
你用的Visual Studio,在调试模式下分配给局部变量的内存会大很多,这是用于检测堆栈异常的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询