Где хранятся постоянные объекты - PullRequest
0 голосов
/ 18 февраля 2011

Я понимаю, что функции не должны возвращать ссылки на автоматические переменные. Однако я просто хотел понять, где хранятся постоянные объекты, т. Е. Хранятся ли они в разделе памяти вместе со статическими глобальными переменными.

Вот код на Visual studio 8. Похоже, что const объекты хранятся как автоматические переменные. Я предполагаю, что все правильно, или это зависит от реализации или это зависит от того, тривиален ли конструктор?

Было бы здорово, если бы кто-то мог объяснить, почему каждый из этих случаев ведет себя так, как они.

//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;
}

Ответы [ 3 ]

6 голосов
/ 18 февраля 2011

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, поскольку все неявно автоматически в пределах его видимости.Это ключевое слово является спецификатором класса хранения для автоматической переменной.

Однако ключевое слово auto изменяется как часть нового стандарта C ++, находящегося в стадии разработки, но уже поддерживается Visual Studio 2010 и некоторыми другими компиляторами в его новомвеликолепная форма.Его можно использовать как в 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
}
2 голосов
/ 18 февраля 2011

Постоянные объекты, размещенные внутри функции, аналогичны любой другой автоматической переменной; у них просто есть const типы. Глобальные (и классовые) переменные немного отличаются: некоторые константы могут быть помещены в части исполняемого файла, доступные только для чтения, а затем просто скопированы в память. Это используется для таких вещей, как строковые и целочисленные константы; Я не верю, что он используется для чего-либо с нетривиальным конструктором.

1 голос
/ 18 февраля 2011

Абсолютно все, где что-то хранится, зависит от конкретной реализации. Никогда этого не забывай. С этой оговоркой, вот некоторые типичные правила.

Автоматические переменные хранятся либо в стеке, либо в регистре. Неважно, постоянны они или нет.

Статические переменные хранятся в памяти программы. Может быть несколько блоков программной памяти, некоторые только для чтения, а некоторые нет. Объявление переменной const может повлиять на то, в каком блоке что-то хранится.

Переменные, выделенные с помощью new, будут в куче. Не важно, констант это или нет.

...