C++ 常量对象存储在哪里

C++ 常量对象存储在哪里,c++,reference,constants,C++,Reference,Constants,我理解函数不应该返回对自动变量的引用。 然而,我只是想了解常量对象存储在哪里,即它是否与静态全局变量一起存储在内存部分 下面是VisualStudio8上的代码。看起来常量对象是作为自动变量存储的。我是否假设事情是正确的,或者它是特定于实现的,还是取决于构造函数是否微不足道 如果有人能解释为什么这些案例都是这样的话,那就太好了 //here i'm intentionally returning a ptr to local const ptr hope the syntax is right

我理解函数不应该返回对自动变量的引用。 然而,我只是想了解常量对象存储在哪里,即它是否与静态全局变量一起存储在内存部分

下面是VisualStudio8上的代码。看起来常量对象是作为自动变量存储的。我是否假设事情是正确的,或者它是特定于实现的,还是取决于构造函数是否微不足道

如果有人能解释为什么这些案例都是这样的话,那就太好了

//here i'm intentionally returning a ptr to local const ptr hope the syntax is right

const char* const* get_const_char_ptr() {
    const char * const ptr = "downontheupside";
    return &ptr;
}

const int& get_const_int() {        
    const int magic_number = 20;
    return magic_number;
}

const string& get_const_string() {       
    const string str("superunknown");
    return str;
}

const string* get_const_string_ptr() {
    const string str("louderthanlove");
    return &str;
}

int main() {
    //case1
    const int &i = get_const_int();
    cout<<"case1:"<<i<<endl;

    //case 2
    const char * const* c =get_const_char_ptr();
    cout<<"case2:"<<*c<<endl;

    //case3
    const string &str = get_const_string();
    //this crashes
    //cout<<"case3:"<<str<<endl;

    return 1;
}

函数中分配的常量对象与任何其他自动变量一样;它们只有常量类型。全局变量和类静态变量略有不同:一些常量可以放在可执行文件的只读部分,然后复制到内存中。用于字符串和整数常量之类的内容;我不相信它用于任何具有非平凡构造函数的东西。

const不会更改存储内容的位置。它是一个关键字,用于告诉编译器防止变量或函数修改内容。例如:

std::string myNormalStr("Hello");
const std::string myConstStr("Don't Change Me");

myNormalStr = myConstStr; // this is ok
myConstStr = myNormalStr; // this will give you a compile error
这是一个超级简单的例子,但同样的事情也适用于传递到函数中、从函数返回或函数本身是const的const对象

下面是使用const关键字的所有正确方法

编辑:

目前几乎没有理由使用auto关键字,因为在它的范围内,所有内容都是隐式自动的。此关键字是自动变量的存储类说明符

然而,AutoTwitter正在作为新C++标准的一部分进行更改,但已经由VisualStudio 2010和其他新的Grand格式的编译器支持。在C++0x中也可以这样使用:

std::vector<int> numbers;
for (std::vector<int>::const_iterator itr(numbers.begin());
    itr != numbers.end(); ++itr)
{
        // do something with each iterated element
}

// compiler auto deduces from rvalue
// and determines that you want a
// std::vector<int>::const_iterator type
for (auto itr = numbers.cbegin();
        itr != numbers.cend(); ++itr)
{
        // do something with each iterated element
}

关于存储位置的所有信息都是特定于实现的。永远不要忘记这一点。有了这个警告,这里有一些典型的规则

自动变量存储在堆栈或寄存器中。不管它们是不是常数

静态变量存储在程序内存中。程序内存可能有多个块,有些是只读的,有些不是。声明变量const可能会影响存储内容的块


用new分配的变量将在堆上。不管它是否为常量。

我不确定我是如何忽略了这一点的:这是大多数系统在实践中发生的情况,但这不是标准所要求的。