C语言C++语言的局部非静态变量或者局部非静态对象在函数开始执行的时候就分配好了内存空间,但是在到达对象或者变量的定义点之前,是不能对其进行引用的。对于局部非静态对象,构造函数只有到定义点才调用。这些都是实现细节,不是C++标准定义的,所以不同的编译器和系统可能有所不同的实现。在C++语言中,一个对象只有调用了构造函数之后才算真正的创建完成,所以即使内存提前分配,但是对象依然还没有完成创建。
Java语言和C++语言本质上不一样:一个是解释型语言、一个是编译型语言。C++语言经过编译之后直接生成CPU可以直接处理的机器指令,而java语言需要首先编译成某个中间语言,执行的时候再由解释器一步一步解释。所以C++语言编写的程序在编译时就可以直接进行优化,比如对于函数的局部变量,因为个数确定、类型确定,所以可以直接在函数的开头生成分配容纳所有局部变量的内存空间的指令(通常是一个修改栈顶的指令),执行一个指令总比执行多个分开的指令要快得多。
你用的Visual Studio,在调试模式下分配给局部变量的内存会大很多,这是用于检测堆栈异常的。