Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.18;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.009 c
4-1253174465
Edward
2009-09-17 12:01
2011.12.18
Дублируются перехваченные с клавиатуры символы


15-1314256768
OW
2011-08-25 11:19
2011.12.18
C чего начать изучение Lotus Notes?


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


15-1314451347
Rouse_
2011-08-27 17:22
2011.12.18
Так проверим же алгебру гармонией! :)


2-1315378230
Виктор
2011-09-07 10:50
2011.12.18
Предупреждение