Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];

Вниз

строковые константы   Найти похожие ветки 

 
Gu   (2011-09-01 18:58) [0]

Приложение использует много строковых констант, которые юзаются во многих его модулях. Вопрос: как будет правильнее объявить их: в начале основного модуля (все другие его юзают) в разделе Consts или в разделе Resourcestring? Есть ли между ними большие отличия и влияет ли это на скорость работы и расход памяти при загрузке приложения и работе?


 
Ega23 ©   (2011-09-01 19:28) [1]


> в начале основного модуля


 
_Юрий   (2011-09-01 19:29) [2]


>  в разделе Consts или в разделе Resourcestring?


Отличие собственно в том, будут ли они константами или строками в ресурсе.
Отличия между ними разумеется большие.
Ресурсные строки обычно делаются в том случае, когда требуется локализация приложения.


 
Gu   (2011-09-01 20:06) [3]

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


 
Anatoly Podgoretsky ©   (2011-09-01 20:07) [4]

> Gu  (01.09.2011 18:58:00)  [0]

Resourcestring правильнее и оптимальнее, об этом заботится система.


 
Rouse_ ©   (2011-09-01 20:07) [5]

В обоих случаях операция производится в памяти


 
Anatoly Podgoretsky ©   (2011-09-01 20:20) [6]

> Rouse_  (01.09.2011 20:07:05)  [5]

Только в первом в памяти все, что сумеет подгрузить, а с ресурсами по
потребностями


 
Rouse_ ©   (2011-09-01 20:50) [7]


> Anatoly Podgoretsky ©   (01.09.11 20:20) [6]
> Только в первом в памяти все, что сумеет подгрузить, а с
> ресурсами по потребностями

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


 
Anatoly Podgoretsky ©   (2011-09-01 20:52) [8]

> Rouse_  (01.09.2011 20:50:07)  [7]

Грузится по 16 строк.


 
Rouse_ ©   (2011-09-01 21:00) [9]

Целиком грузится :) Если-б образ исполняемого файла не грузился в память целиком вместе со всеми секциями, включая секцию ресурсов, то было-бы не возможно такое понятие, как дамп образа.


 
Rouse_ ©   (2011-09-01 21:01) [10]

зы: скомпиляй вот эту демку, она наглядно все кажет, что где и каким образом: http://rouse.drkb.ru/winapi.php#pmm


 
Игорь Шевченко ©   (2011-09-01 22:48) [11]

Rouse_ ©   (01.09.11 21:00) [9]

100-мегабайтный инсталлятор тоже целиком в память грузится ?

вот у меня есть файл:

Turbo Dump  Version 6.3.0.0 Copyright (c) 1988-2009 Embarcadero Technologies, Inc.
        Display of File windowsxp.x86.fre.rtm.symbols.exe

Object table:
#   Name      VirtSize    RVA     PhysSize  Phys off  Flags  
--  --------  --------  --------  --------  --------  --------
01  .text     000085F2  00001000  00008600  00000400  60000020 [CER]
02  .data     00001BE4  0000A000  00000400  00008A00  C0000040 [IRW]
03  .rsrc     095D4000  0000C000  095D3E00  00008E00  40000040 [IR]

Все секции будут при запуске сразу на память отображены ?


 
Rouse_ ©   (2011-09-02 01:26) [12]

Инсталятор? А коим образом он к исполняемому файлу то относится? Загрузочный стаб и секция передаваемая MSI службе


 
Игорь Шевченко ©   (2011-09-02 09:49) [13]


> А коим образом он к исполняемому файлу то относится?


имеет PE-формат


 
Rouse_ ©   (2011-09-02 10:38) [14]


> Игорь Шевченко ©   (01.09.11 22:48) [11]

Кстати именно этот инсталятор таки да, грузится целиком...


 
Игорь Шевченко ©   (2011-09-02 10:38) [15]


> Кстати именно этот инсталятор таки да, грузится целиком.
> ..


prove it


 
Игорь Шевченко ©   (2011-09-02 10:40) [16]

Для начала неплохо бы договориться о терминологии: что значит "грузится" ?


 
Rouse_ ©   (2011-09-02 10:41) [17]


> Игорь Шевченко ©   (02.09.11 10:38) [15]
> prove it

http://rouse.drkb.ru/tmp/m.png


 
han_malign   (2011-09-02 10:53) [18]


> prove it

http://support.microsoft.com/default.aspx?scid=kb;en-us;193678


 
Игорь Шевченко ©   (2011-09-02 12:56) [19]

Это все хорошо, но где написано, что "грузятся" ? Хоть на одной картинке ?
Лежат себе на диске преспокойно, как и неиспользуемые страницы кодового сегмента.


 
Rouse_ ©   (2011-09-02 13:09) [20]


> Игорь Шевченко ©   (02.09.11 12:56) [19]
>
> Это все хорошо, но где написано, что "грузятся" ? Хоть на
> одной картинке ?
> Лежат себе на диске преспокойно, как и неиспользуемые страницы
> кодового сегмента.

Ну тут дело в том, что если снять дамп процесса и при этом запустить FileMon, то отчетливо будет видно, что зачитки данных с образа файла на диске не происходит.


 
Игорь Шевченко ©   (2011-09-02 13:15) [21]

Rouse_ ©   (02.09.11 13:09) [20]

А если запустить FileMon до запуска процесса ? Он покажет чтение ВСЕГО исполняемого файла ?


 
Rouse_ ©   (2011-09-02 13:17) [22]

Да, файл будет зачитан целиком


 
Slym ©   (2011-09-02 13:26) [23]

Rouse_ ©   (02.09.11 13:17) [22]
антивирь отключи чтоб не сканил предварительно


 
Rouse_ ©   (2011-09-02 13:32) [24]

Я на виртуалке тестировал, у меня файл символов там лежит с сайсом, там антивиря нет...


 
Игорь Шевченко ©   (2011-09-02 13:32) [25]

ради интереса запустил FileMon и указанный файл. Чтения всех 146 мегабайт не увидел. И не ожидал увидеть, так как в книжках, начиная с Рихтера, написано, что исполняемые файлы читаются по мере надобности, а не  целиком при запуске.


 
Rouse_ ©   (2011-09-02 13:33) [26]

А чтение при дампе увидел?


 
Rouse_ ©   (2011-09-02 13:34) [27]

Кстати, выгрузку всей ресурсной секции в временную папку тоже не увидел? Интересно тогда, как это она так без полного чтения то?


 
Игорь Шевченко ©   (2011-09-02 13:37) [28]


> А чтение при дампе увидел?


что такое дамп ?


 
Rouse_ ©   (2011-09-02 13:40) [29]

У максвела этот процесс описан вот так: http://www.netlib.narod.ru/library/book0010/ch08_07.htm


 
Игорь Шевченко ©   (2011-09-02 13:48) [30]


> У максвела этот процесс описан вот так


"Наиболее распространенным двоичным форматом Linux является ELF, поэтому рассмотрим, как двоичный обработчик ELF выполняет дамп памяти.
"

Как прикажешь тебя понимать ?

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


 
Rouse_ ©   (2011-09-02 13:59) [31]


> Как прикажешь тебя понимать ?

Ссылка была дана как описание того, что есть дамп памяти.


> Ты обращаешься ко всем страницам памяти в адресном пространстве
> процесса, вызывая их отображение на физическую память.

Откуда они отображаются? Где хранятся не отображенные данные?

Я же тебе еще раз говорю, ты сказал что не увидел зачитки всего файла.
Ладно допустим. Но проблемка в том что при старте инсталятор символов выгружает во временную папку хранящиеся в секции ресурсов файлы eula.txt simbols.cab simbols.cat и т.д.
Вопрос, откуда он их взял, чтения файла то не было по твоему утверждению? Или может быть все-же идущая перед выгрузкой запись запись LoadImage с указанием размера нам намекает?


 
Игорь Шевченко ©   (2011-09-02 15:06) [32]


> Откуда они отображаются? Где хранятся не отображенные данные?


на диске.


> Вопрос, откуда он их взял,


Вот в момент обращения к этим данным и было чтение. Через диспетчер памяти.


 
Rouse_ ©   (2011-09-02 15:11) [33]


> в момент обращения к этим данным и было чтение

А FileMon его не показал... понятно.


 
Юрий Зотов ©   (2011-09-02 15:20) [34]

Если я правильно понял Рихтера, то ни один файл (включая исполнимые) ПОЛНОСТЬЮ в ОЗУ никогда не грузится. Он отображается на АП процесса, а в ОЗУ грузится постранично, по мере надобности (конечно, с учетом еще и кэша страниц). То есть, сам дисковый файл как бы используется в качестве некоего свопа.


 
Юрий Зотов ©   (2011-09-02 15:22) [35]

Разве что весь файл умещается в одной странице... тогда загрузится полностью, конечно.
:o)


 
Rouse_ ©   (2011-09-02 15:39) [36]

Да это все понятно, просто я то речь веду про виртуальную память, а не про физическую...


 
Inovet ©   (2011-09-02 15:41) [37]

> [34] Юрий Зотов ©   (02.09.11 15:20)
> файл как бы используется в качестве некоего свопа

Разве механизм не один и тот же что и в свопе. Просто файл и так уже на диске находится.


 
Inovet ©   (2011-09-02 15:44) [38]

> [36] Rouse_ ©   (02.09.11 15:39)
> я то речь веду про виртуальную память

Так на то и виртуальная, чтобы без надобности не читать в ОЗУ. Зачем, если данные или код могут не разу не понадобиться


 
Игорь Шевченко ©   (2011-09-02 16:30) [39]

FileMon показывает чтение в физическую память :)


 
Anatoly Podgoretsky ©   (2011-09-02 16:50) [40]

> Юрий Зотов  (02.09.2011 15:20:34)  [34]

resourcestring именно такой, не гонится в своп, он сам часть свопа


 
Anatoly Podgoretsky ©   (2011-09-02 16:52) [41]

> Rouse_  (02.09.2011 15:39:36)  [36]

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


 
Германн ©   (2011-09-03 00:50) [42]


> Anatoly Podgoretsky ©   (02.09.11 16:52) [41]
>
> > Rouse_  (02.09.2011 15:39:36)  [36]
>
> а мы как бы про физическую все время вели речь.

Ну и зачем вели?
По сабжу разницы практически никакой.


 
Германн ©   (2011-09-03 00:54) [43]

Вообще (имхо) сабж сам по себе глупый.
Ладно бы речь шла о математической обработке физического эксперимента. Или о математическом моделировании чего-то.


 
_Юрий   (2011-09-04 13:42) [44]

Немного не в тему

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

Поэтому я стал делать по другому: прятать константы в код, и его уже помещать в общие модули. Чаще всего подобные константы - текстовки ошибок.
Тогда  вместо, например

const
 SFileNotFound = "Файл %s не найден";

...
if not FileExist(fileName) then
 raise EPathException.CreateFmt(SFileNotFound, [fileName]);

пишу нечто типа

type
 EPathException = class(Exception)
 public
   constructor FileNotFound(fileName: string);
 end;

constructor EPathException.FileNotFound(fileName: string);
resourcestring;
 SFileNotFound = "Файл %s не найден";
begin
 CreateFmt(SFileNotFound, [fileName]);
end;

...
if not FileExist(fileName) then
 raise EPathException.FileNotFound(fileName);

Конструкторов может быть много - свой для каждого случая.

Если константа - какое то название, то ее лучше перенести в соответствующий класс (в виде вложенной константы, а если не позволяет версия Delphi, то в виде классовой функции). По тем же причинам.

Посмотрите, может быть вам такой подход покажется более подходящим


 
Игорь Шевченко ©   (2011-09-04 14:24) [45]

_Юрий   (04.09.11 13:42) [44]

VCL/RTL предлагают другой путь - по юнитам (rtl,db,...)consts

Где золотая середина ?

(Ну и до кучи - я не понимаю использования resourcestring в нелокализуемом проекте. Я вообще не понимаю использования resourcestring, потому что я не могу им управлять - не знаю идентификаторов ресурсов, а оставлять все это на откуп ITE - у меня с ним плохие отношения, еще со старых версий, где он глючил со страшной силой. Может, эти глюки и убрали, но осадок остался).


 
Anatoly Podgoretsky ©   (2011-09-04 14:53) [46]

> Игорь Шевченко  (04.09.2011 14:24:45)  [45]

Может быть, но на семерке глюков не было обнаружено, кроме того локализации
поддается не только свой код, но и бесплатный подарок в придачу, еще и
некоторые модули.

А resourvestring есть смысл использовать из-за некоторой оптимальности
работы системы, но наверно ты и так это знаешь, читал наверно у Рихтера.
Потом если захочешь локализировать ничего переделывать не придется, а у ITE
локализация на уровне, не только тексты.


 
Игорь Шевченко ©   (2011-09-04 15:08) [47]

Anatoly Podgoretsky ©   (04.09.11 14:53) [46]

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


 
Anatoly Podgoretsky ©   (2011-09-04 15:55) [48]

> Игорь Шевченко  (04.09.2011 15:08:47)  [47]

Без установки никак. Нужен поноценный редактор ресурсов Дельфи, то есть
видеть и изменять формы, как минимум, такой редактор есть в ITE, он есть в
автономном варианте. С ITE основная проблема - психологическое
сопротивление.


 
Eraser ©   (2011-09-04 21:46) [49]

http://matrix.kladovka.net.ru/index.php?page=downloads&categ=other&pagenum=1 см. "multilang.zip". Мощнейшее и простое средство для работы с локализацией. Правда для полноценной работы я туда привинтил слабенькую поддержку коллекций, но зато теперь фактически универсальный инструмент. четвертый год работает отлично. а ITE мастдай, это с самого начало понятно. что за локализатор такой, которому исходники подавай? это противоречит всей концепции локализации проектов, т.к. обычно локализацию на аутсорс отдают.


 
_Юрий   (2011-09-05 21:39) [50]


> Игорь Шевченко ©   (04.09.11 14:24) [45]


> VCL/RTL предлагают другой путь - по юнитам (rtl,db,...)consts


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


 
Игорь Шевченко ©   (2011-09-05 23:02) [51]

_Юрий   (05.09.11 21:39) [50]


> Сейчас, думаю, они бы написали уже не так.


Не уверен. У них каждый юнит consts относится к конкретному пакету, при разделении vcl на vcl и rtl константы тоже разделились, на consts (vcl) и rtlconsts

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

Я к тому, что у Борландов в такой организации констант есть цель.


 
_Юрий   (2011-09-06 20:24) [52]


> Игорь Шевченко ©   (05.09.11 23:02) [51]


Рискну предположить, что такое отделение возникло еще до ITE.
Который появился по моему в Delphi5.
Пока его не было, можно было совершить подмену юнита с константами на свой, и таким образом хоть как-то решить проблему локализации.
Если бы константы были размазаны по коду, это бы не взлетело.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.009 c
15-1314736194
Юрий
2011-08-31 00:29
2011.12.18
С днем рождения ! 31 августа 2011 среда


15-1314945552
ClawClaw
2011-09-02 10:39
2011.12.18
Составление расписание в ВУЗе


2-1315922445
Сергей М.
2011-09-13 18:00
2011.12.18
OpenCV - поиск алф.-цифр-символьных объектов в изображении


15-1314995392
Юрий
2011-09-03 00:29
2011.12.18
С днем рождения ! 3 сентября 2011 суббота


15-1314390597
Юрий
2011-08-27 00:29
2011.12.18
С днем рождения ! 27 августа 2011 суббота





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский