crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> копирование и память
Iron Bug
  опции профиля:
сообщение 22.12.2011, 16:03
Сообщение #11


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(rp80 @ 22.12.2011, 15:47) *
В какое?

в сегмент данных. впрочем, может, компилятор для оптимизации их даже в сегмент кода упихивает, ибо константы не меняются, а ближние указатели быстрее.
Цитата(rp80 @ 22.12.2011, 15:47) *
Что происходит с данными s? Как освобождается память занимаемая ими? И освобождается ли вообще?

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

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 22.12.2011, 17:50
Сообщение #12


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Цитата(rp80 @ 22.12.2011, 13:47) *
Правильно копировать так:
    char* c =new char[30];
    char* cc="zca";
    delete[] c;
    c=new char[sizeof(cc)];
    for(size_t i=0;i<sizeof(cc);++i)
    c[i]=cc[i];

Не правильно. sizeof(cc) вернет размер указателя, а не массива. В данном случае это сработает только по тому что вы создали 4-х байтный массив.

Цитата
а если это оптимизированное хранение констант в сегменте кода, то их в принципе невозможно удалить

Теоретически возможно. Только это путь даже не джедая, а какого-то безумного ситха, ибо придется не только найти строки в памяти и удалить, но и подредактировать код (не исходный, а тот что висит в памяти в виде процессорных иструкций) так чтобы прога думала что никакой переменной и не существовало. :D

Сообщение отредактировал ilyabvt - 22.12.2011, 17:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 22.12.2011, 19:17
Сообщение #13


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 22.12.2011, 17:03) *
с константными строками ничего не происходит. они остаются. компилятор всё равно выделяет под них место в данных - нет смысла их удалять. во всяком случае, мне не известно о какой-либо хитрой рантайм оптимизации неиспользованных данных. а если это оптимизированное хранение констант в сегменте кода, то их в принципе невозможно удалить. если хочешь, чтобы строки не занимали место - грузи их динамически из какого-то стороннего файла.


Т.е. если где-то в функции мы создаем десять строк по 100 мб, то экзешник будет 1000+ мб?
Ну и правильно я понимаю, что строки это не исключение из правил? Значит значения любых базовых или пользовательских локальных переменных и массивов этих переменных сохраняются в коде?

Сообщение отредактировал rp80 - 22.12.2011, 19:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 22.12.2011, 19:50
Сообщение #14


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Цитата(rp80 @ 22.12.2011, 22:17) *
Цитата(Iron Bug @ 22.12.2011, 17:03) *
с константными строками ничего не происходит. они остаются. компилятор всё равно выделяет под них место в данных - нет смысла их удалять. во всяком случае, мне не известно о какой-либо хитрой рантайм оптимизации неиспользованных данных. а если это оптимизированное хранение констант в сегменте кода, то их в принципе невозможно удалить. если хочешь, чтобы строки не занимали место - грузи их динамически из какого-то стороннего файла.


Т.е. если где-то в функции мы создаем десять строк по 100 мб, то экзешник будет 1000+ мб?
Ну и правильно я понимаю, что строки это не исключение из правил? Значит значения любых базовых или пользовательских локальных переменных и массивов этих переменных сохраняются в коде?


Не забывайте что речь идет о константных строках, т.е. тех значение которых мы явно задаем в программе. Вы часто в исходнике пишете строку длинною 100 миллионов символов? Строки действительно не исключение, числа заданные явно тоже хранятся в коде.
Вот например есть код:
int a = 2;

Переменная 'а' хранится в стеке, а число 2 в коде.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 22.12.2011, 20:03
Сообщение #15


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ilyabvt @ 22.12.2011, 20:50) *
Не забывайте что речь идет о константных строках, т.е. тех значение которых мы явно задаем в программе. Вы часто в исходнике пишете строку длинною 100 миллионов символов? Строки действительно не исключение, числа заданные явно тоже хранятся в коде.
Вот например есть код:
int a = 2;

Переменная 'а' хранится в стеке, а число 2 в коде.

Спасибо за пояснение. Ну есстественно, программист сам не задает такие строки. Но, например, строку в которую читают из файла размером в 100 000 000 символов представить вполне можно. Это же тоже явное задание?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 22.12.2011, 20:13
Сообщение #16


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Цитата(rp80 @ 22.12.2011, 23:03) *
Цитата(ilyabvt @ 22.12.2011, 20:50) *
Не забывайте что речь идет о константных строках, т.е. тех значение которых мы явно задаем в программе. Вы часто в исходнике пишете строку длинною 100 миллионов символов? Строки действительно не исключение, числа заданные явно тоже хранятся в коде.
Вот например есть код:
int a = 2;

Переменная 'а' хранится в стеке, а число 2 в коде.

Спасибо за пояснение. Ну есстественно, программист сам не задает такие строки. Но, например, строку в которую читают из файла размером в 100 000 000 символов представить вполне можно. Это же тоже явное задание?

Нет конечно, мало ли что будет в этом файле (и будет ли он вообще) на момент компиляции. А потом, файл вы считываете в переменную. А речь сейчас не о них. Речь о константных данных. Явное задание это то что программист указывает в коде.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 22.12.2011, 20:31
Сообщение #17


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ilyabvt @ 22.12.2011, 21:13) *
Нет конечно, мало ли что будет в этом файле (и будет ли он вообще) на момент компиляции. А потом, файл вы считываете в переменную. А речь сейчас не о них. Речь о константных данных. Явное задание это то что программист указывает в коде.

Хорошо, а где хранятся данные переменных? В самом стеке? И в примере с чтением из файла в какой-то момент будет переполнение стека, если файл достаточно большой?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.12.2011, 20:35
Сообщение #18


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(ilyabvt @ 22.12.2011, 20:50) *
Теоретически возможно. Только это путь даже не джедая, а какого-то безумного ситха, ибо придется не только найти строки в памяти и удалить, но и подредактировать код (не исходный, а тот что висит в памяти в виде процессорных иструкций) так чтобы прога думала что никакой переменной и не существовало. :D

нет. сегмент кода не может менять содержимое ни в одной из современных осей. это главное правило: код не может модифицировать сам себя. это только в DOSе можно было писать такие кренделя. любая защищённая система этого не позволяет.
модифицировать можно исполняемый файл, например. или в отладчике писать какие-то значения в регистры. или подгружать какие-то библиотеки на ходу. но сама программа себя менять никак не может. просто нет прав на запись в сегмент кода.

Цитата(rp80 @ 22.12.2011, 23:31) *
Хорошо, а где хранятся данные переменных? В самом стеке? И в примере с чтением из файла в какой-то момент будет переполнение стека, если файл достаточно большой?

смотря каких. константы могут быть сложены в сегмент кода (раз они не меняются). переменные, которые обычные - в сегменте данных. можно ещё регистровые переменные создавать - они, соответственно, будут размещены в регистрах, если компилятор сможет их так распределить. если не сможет - то всё равно в сегменте данных.


Сообщение отредактировал Iron Bug - 22.12.2011, 20:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 22.12.2011, 23:11
Сообщение #19


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 22.12.2011, 21:35) *
смотря каких. константы могут быть сложены в сегмент кода (раз они не меняются). переменные, которые обычные - в сегменте данных. можно ещё регистровые переменные создавать - они, соответственно, будут размещены в регистрах, если компилятор сможет их так распределить. если не сможет - то всё равно в сегменте данных.

Вообще вот цитата из википедии: A data segment is a portion of virtual address space of a program, which contains the global variables and static variables that are initialized by the programmer.
Т.е. они называют сегментом данных то что вы называете сегментом кода. Непонятно кто прав..
А насчет утечек вот пример
int main()
{
    int* pi;
    {
        int ar[1000000];
        ar[3]=std::rand() % 10 + 1;
        pi=ar;
    }
    std::cout<<pi[3];
}

Работает, не падает, разве это не говорит об утечке? Блок закрылся, переменная ar удалена из стека, но выделенный массив остался в памяти.

И если я меняю размер массива на 10, то размер экзешника уменьшается (18693 на 18677). Т.е. похоже на то, что данные хранятся в коде. Но тогда получается что такой неявно заданный объект тоже хранит данные в сегменте кода.

И везде где я читаю пишут что есть 3 типа памяти: Сегмент кода - хранит текст программы + константы и статик переменные. Стэк - хранит локальные переменные. Куча - хранит динамические переменные. Нигде не видел упоминание о сегменте данных как о 4ом виде памяти, связанном со стеком.

Сообщение отредактировал rp80 - 22.12.2011, 23:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 23.12.2011, 7:33
Сообщение #20


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


rp80, стек то никуда не девается. А то, что ты правильно выводишь якобы - это уже мусор, одна ко по чистой случайности этот мусор пока ещё соответствует тому, что в него поместили внутри вложенного блока

попробуй вот так

int main()
{
    int* pi;
    {
        int ar[1000000];
        ar[3]=std::rand() % 10 + 1;
        pi=ar;
    }
  
    int ar2[20]={1,2,3,4};
    std::cout<<pi[3];
}


Сообщение отредактировал Алексей1153 - 23.12.2011, 7:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  < 1 2 3 4 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 10:38