LINUX.ORG.RU

[C]Аллокация строки

 


0

0

Правильно ли я понимаю, что при подобном случае:

const char *str = "Test string";

память под строковый литерал выделяется где-то в read-only сегменте данных? Сразу же возникает вопрос: каков период жизни такого литерала? Правильно ли понимаю, что период жизни совпадает с периодом жизни программы и при последующем использовании такого же литерала:

const char *str2 = "Test string";

я получу указатель на ту же самую область памяти? Особенно интересует, определено это где-то в стандарте С или эта реализация/поведение (время жизни литерала) зависят от компилятора?

★★★★

> я получу указатель на ту же самую область памяти?

зависит от компилятора/линковщика и их параметров

ahonimous
()

Исключительно дело компилятора. То, что указатели получились равны — это уже оптимизация используемой памяти.

balodja ★★★
()

В вендокомпиляторах это называется merge duplicated strings.

anon_666
()
Ответ на: комментарий от MuZHiK-2

До конца программы без динамических модулей точно не умрёт. В случае выгрузки dll возможно освободит память.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

>>До конца программы без динамических модулей точно не умрёт. В случае выгрузки dll возможно освободит память.

А это где-то в стандарте определено?

MuZHiK-2 ★★★★
() автор топика
void testf()
{
    int a;
    const char *str = "Test string";
    int b;
    qDebug() << &a;
    qDebug() << (void*)str;
    qDebug() << &b;
}

void testf2()
{
    const char *str2 = "Test string";
    qDebug() << (void*)str2;
}

int main(int argc, char* argv[])
{
    testf();
    testf2();
    return 0;
}

g++ выводит такое

0xbfde6e0c 
0x80493e0 
0xbfde6e04 
0x80493e0

то есть, для плюсов

я получу указатель на ту же самую область памяти?

да

дальше

void testf()
{
    int a;
    const char *str = "Test string";
    int b;
    qDebug() << &a;
    qDebug() << (void*)str;
    qDebug() << &b;
    char* modstr = const_cast<char*>(str);
    modstr[2] = 'X';
    qDebug() << str;
}

void testf2()
{
    const char *str2 = "Test string";
    qDebug() << (void*)str2;
    qDebug() << str2;
}

int main(int argc, char* argv[])
{
    testf();
    testf2();
    return 0;
}

вывод

0xbfe10b9c 
0x80495d0 
0xbfe10b94 
Программа неожиданно завершилась.

память под строковый литерал выделяется где-то в read-only сегменте данных?

судя по всему да

antony986
()

Особенно интересует, определено это где-то в стандарте С или эта реализация/поведение (время жизни литерала) зависят от компилятора?

опять же в плюсовом стандарте

2.13.4.1

An ordinary string literal has type “array of n const char” and static storage duration (3.7), where n is the size of the string as defined below, and is initialized with the given characters

3.7.1

Static storage duration 1 All objects which neither have dynamic storage duration nor are local have static storage duration. The storage for these objects shall last for the duration of the program

в сях скорее всего тоже самое, просто поищи

antony986
()
Ответ на: комментарий от antony986

>>GCC no longer accepts the -fwritable-strings option. Use named character arrays when you need a writable string.

То есть, раньше у них было это реализовано через COW, выходит?

MuZHiK-2 ★★★★
() автор топика
Ответ на: комментарий от MuZHiK-2

хз, может в одну пишешь, а это затрагивает и все остальные %)

antony986
()
Ответ на: комментарий от MuZHiK-2

> раньше у них было это реализовано через COW, выходит?

Никогда не было. Раньше это был не ридонли массив.

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.