C++ 定义变量并立即使用

C++ 定义变量并立即使用,c++,C++,定义变量并立即使用与以后使用有什么区别?它们是否由于初始化而落在内存映射的不同部分 例如: 立即定义和使用 inta=b+2; 以后定义和使用 inta; a=b+2; 虽然初始化和赋值不是一回事,但在这个特定示例中,两段代码的语义完全相同,因此您以不同的方式创建了相同的程序 这些程序的行为或实现不会有任何差异。虽然初始化和赋值不是一回事,但在这个特定示例中,两段代码的语义完全相同,因此您以不同的方式创建了相同的程序 这些程序的行为或实现将没有差异。对于likeint,这里没有差异。这两个片段

定义变量并立即使用与以后使用有什么区别?它们是否由于初始化而落在内存映射的不同部分

例如:

  • 立即定义和使用
  • inta=b+2;
    
  • 以后定义和使用
  • inta;
    a=b+2;
    
    虽然初始化和赋值不是一回事,但在这个特定示例中,两段代码的语义完全相同,因此您以不同的方式创建了相同的程序


    这些程序的行为或实现不会有任何差异。

    虽然初始化和赋值不是一回事,但在这个特定示例中,两段代码的语义完全相同,因此您以不同的方式创建了相同的程序

    这些程序的行为或实现将没有差异。

    对于like
    int
    ,这里没有差异。这两个片段将创建完全相同的行为

    但是,在处理类对象时,这种情况会发生变化。这两者之间可能有很大的区别:

    foo obj = b + 2;
    

    如果
    b
    属于
    int
    类型,且
    foo
    定义为:

    class foo {
    private:
        int a;
    public:
        foo(int x) : a(x) { }
    };
    
    然后第二个代码段(
    foo obj;obj=b+2
    )甚至不会编译,而第一个代码段仍然会编译

    下面是一个带有一些打印的示例,您可以通过运行和调试来查看发生了什么:

    #包括
    福班{
    私人:
    INTA;
    公众:
    foo():a(0){std::cout对于like
    int
    ,这里没有区别。这两个代码片段将创建完全相同的行为

    但是,在处理类对象时,这种情况会发生变化。这两者之间可能有很大的区别:

    foo obj = b + 2;
    

    如果
    b
    属于
    int
    类型,且
    foo
    定义为:

    class foo {
    private:
        int a;
    public:
        foo(int x) : a(x) { }
    };
    
    然后第二个代码段(
    foo obj;obj=b+2
    )甚至不会编译,而第一个代码段仍然会编译

    下面是一个带有一些打印的示例,您可以通过运行和调试来查看发生了什么:

    #包括
    福班{
    私人:
    INTA;
    公众:
    
    foo():a(0){std::cout您可能指的是局部变量,在这种情况下,两个示例不会有太大不同。只是示例2使用了两个语句来做相同的事情。局部变量使用堆栈指针,因此,如果您想了解有关如何工作的更多信息,请参见此处


    如果这些是全局变量,示例1可能会立即初始化
    部分中的变量。data
    ,示例2将保留
    sizeof(int)的字节数
    部分。bss
    中,然后在代码部分赋值。

    您可能指的是局部变量,在这种情况下,两个示例不会有太大不同。只是示例2使用了两个语句来做同一件事。局部变量使用堆栈指针,因此如果您想了解更多关于这一点的信息请看这里


    如果这些是全局变量,则示例1可能会立即初始化
    部分中的变量。data
    和示例2会在
    部分中保留
    sizeof(int)
    的字节数。bss
    然后在code部分中分配值。

    我假设它是一个局部变量(第二个示例不会编译)。如果使用“内存映射的节”你是指编译后的二进制数据段,那么局部变量通常根本不存在。它可能根本不在内存中。它可能在登记器中。或者它可以完全被优化。C++中所知道的是,局部变量将有自动存储,如果优化了,它将表现为它仍然存在。可以在这里阅读更多。旁注:当观察到的行为没有差异,用户可能看不到任何变化时,编译器可以做任何它想做的事情,将1变成2或2变成1,甚至完全放弃计算。这被称为。这是允许编译器优化代码的地方。最好想想你的code描述编译器的行为,而不是要执行的指令。编译器的工作是生成将执行所描述行为的指令。我假设它是一个局部变量(第二个示例不会编译)。如果通过“内存映射的部分”你是指编译后的二进制数据段,那么局部变量通常根本不存在。它可能根本不在内存中。它可能在登记器中。或者它可以完全被优化。C++中所知道的是,局部变量将有自动存储,如果优化了,它将表现为它仍然存在。可以在这里阅读更多。旁注:当观察到的行为没有差异,用户可能看不到任何变化时,编译器可以做任何它想做的事情,将1变成2或2变成1,甚至完全放弃计算。这被称为。这是允许编译器优化代码的地方。最好想想你的code描述编译器的行为,而不是要执行的指令。编译器的工作是生成将执行所描述行为的指令。