Сохраненное ключевое слово в Delphi

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

С помощью gcc4.8.3 clear () может показаться, что он освобождает память в каком-то сценарии.

std::string local("this is a test");
std::cout << "Before clear: " << local.capacity() << '\n';
local.clear();
std::cout << "After clear:  " << local.capacity() << '\n';

Как и ожидалось, я получаю

    Before clear: 14
    After clear: 14

Теперь добавьте еще одну строку в микс:

std::string local("this is a test");
std::string ref(local);  // created from a ref to local
std::cout << "Before clear: " << local.capacity() << '\n';
local.clear();
std::cout << "After clear:  " << local.capacity() << '\n';

На этот раз я получаю:

    Before clear: 14
    After clear: 0

Похоже, что stdc ++ имеет некоторую оптимизацию, когда это возможно, совместно использовать память, содержащую строковое содержимое. В зависимости от того, является ли строка общей или нет, поведение будет отличаться. В последнем примере, когда вызывается clear (), создается новый экземпляр внутреннего локального файла std :: string и он будет пустым (). Емкость будет установлена ​​равной 0. Из вывода функции capacity () можно сделать вывод, что некоторая память была освобождена, но это не так.

Это можно доказать с помощью следующего кода:

std::string local("this is a test");
std::string ref(local);  // created from a ref to local
std::cout << (int*)local.data() << ' ' << (int*)ref.data() << '\n';

Дает:

    0x84668cc 0x84668cc

Две строки указывают на одни и те же данные, я не рассматривал это. Добавьте local.clear () или что-нибудь, что изменяет местный или ref, и, следовательно, адреса будут отличаться.

С уважением

14
задан JPvdMerwe 15 January 2010 в 14:14
поделиться

2 ответа

Из моего файла справки Delphi 7:

Дополнительное хранимое, по умолчанию и Директивы NODEFAULT называются Спецификаторы хранения. У них нет влияние на поведение программы, но контролировать, следует ли сохранить Значения опубликованных свойств в форме файлы.

ДОЛЖЕН ДОЛЖЕН ДОЛЖЕН ДОЛЖЕН Правда, ложно, имя логического поле или имя параметра Метод, который возвращает логическое значение. Например,

 Имя свойства: TComponentname Чтение FNAME Написание SETNAME сохранено false;
 

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

Это звучит, как он контролирует, следует ли хранить свойство, относящееся к компоненту в файле .dfm для формы. (Просто думаю, хотя)

24
ответ дан 1 December 2019 в 09:01
поделиться

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

6
ответ дан 1 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: