Конференция "Основная" » Насколько адекватен SizeOf
 
  • Sha © (06.06.08 14:52) [60]
    > Anatoly Podgoretsky ©   (06.06.08 14:41) [59]

    Это не я писал, хотя это верно :)
    Последовательность действий по воспроизведению бага описана [16].
    Тут суть в том, что модули на диске не перезаписываются и дата у них не меняется.
    Изменения делаются непосредственно в среде Дельфи.
    И некоторые из них Дельфи учитывает в зависимых модулях, а некоторые - нет.
  • Anatoly Podgoretsky © (06.06.08 15:09) [61]
    > Sha  (06.06.2008 14:52:00)  [60]

    Я уже матюгался? Нет, ну тогда матюгаюсь, Борланд пошел по попсовому пути, набросать много не нужных функций, и попутно теряя надежность компилятора, делая всякие колокольчики. А переход к ebarcader может ситуацию еще больше ухудшить. Все лучшие кадры подарили или Микрософту или Ораклу и другим фирмам.
  • Плохиш © (06.06.08 15:15) [62]

    > Sha ©   (06.06.08 14:03) [57]
    > > Плохиш ©   (06.06.08 13:42) [55]
    > > для последнего поля выделяется один байт, только в одном
    > случае, когда выравнивание установлено в 1 {A1}.
    >
    > Здесь, конечно, дело вкуса.
    >
    > Тебе почему-то удобней думать, что последнее поле, в котором
    > лежит однобайтовая переменная, занимает 8 байт,

    Согласись, что понятия "занимает байт" и "распределено байт" несколько отличаются. И мне как-то удобней думать, что структуры данных занимают столько байт, как это описано в документации разработчиков компилятора.
  • Плохиш © (06.06.08 15:16) [63]

    > Anatoly Podgoretsky ©   (06.06.08 15:09) [61]

    +1 :-(
  • имя (06.06.08 15:23) [64]
    Удалено модератором
    Примечание: offtopic
  • Sha © (06.06.08 15:30) [65]
    Удалено модератором
    Примечание: offtopic
  • Anatoly Podgoretsky © (06.06.08 15:34) [66]
    Удалено модератором
    Примечание: offtopic
  • имя (06.06.08 15:40) [67]
    Удалено модератором
    Примечание: offtopic
  • Плохиш © (06.06.08 15:46) [68]
    Нифигасе, страсти накалились 8-O
  • Sha © (06.06.08 16:40) [69]
    > Плохиш ©   (06.06.08 15:15) [62]

    Вот пример, который прояснит мою позицию.
    Известно, что память в Д7 под строки выделяется двойными словами. И если длина строки кратна 4, то терминатор попадает в отдельный dword. Но никому ведь не приходит в голову говорить, что терминатор занимает или под него выделено двойное слово, потому что три лишних байта потребовались строке в целом, а не терминатору. Т.е. размер строки был округлен до 4 вверх.
    Так и случае с записями. Лишние байты не принадлежат последнему полю. На мой взгляд.
  • Anatoly Podgoretsky © (06.06.08 16:45) [70]
    Это понятно, но это психология, тут претензии только к Борланду, а есть ли при работе ошибка?
  • Palladin © (06.06.08 16:57) [71]

    > Лишние байты не принадлежат последнему полю.

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

    интересный эксперимент
    {$A8}
    TMR1=Record
     a:Byte;
     // - щель 1b
     c:Word;
     d:Byte;
     // - щель 1b
     e:Word;
    End; // 8b

    TMR2=Record
     a:Byte;
     // 1b
     c:Word;
     // 2b
     d:Byte;
     // 3b
     e:Integer;
    End; // 12b

    хотя

    {$A2}
    TMR1=Record
     a:Byte;
     // - щель 1b
     c:Word;
     d:Byte;
     // - щель 1b
     e:Word;
    End; // 8b

    TMR2=Record
     a:Byte;
     // 1b
     c:Word;
     // 2b
     d:Byte;
     // 1b
     e:Integer;
    End; // 10b

  • Palladin © (06.06.08 17:07) [72]
    в последнем типе ошибся

    {$A2}
    TMR2=Record
    a:Byte;
    // 1b
    c:Word;
    d:Byte;
    // 1b
    e:Integer;
    End; // 10b

  • Palladin © (06.06.08 17:58) [73]
    так, еще раз и без косяков... :)

    {$A8}
    TMR1=Record
     a:Byte;
     "просвет" 1b
     c:Word;
     d:Byte;
     "просвет" 1b
     e:Word;
    End; 8b

    TMR2=Record
     a:Byte;
     "просвет" 1b
     c:Word;
     d:Byte;
     "просвет" 3b
     e:Integer;
    End; 12b

    {$A2}
    TMR1=Record
     a:Byte;
     "просвет" 1b
     c:Word;
     d:Byte;
     "просвет" 1b
     e:Word;
    End; 8b

    TMR2=Record
     a:Byte;
     "просвет" 1b
     c:Word;
     d:Byte;
     "просвет" 1b
     e:Integer;
    End; 10b

  • Sha © (06.06.08 18:32) [74]
    > Anatoly Podgoretsky ©   (06.06.08 16:45) [70]
    > ... а есть ли при работе ошибка?

    В [51] я попытался кратко изложить логику работы компилятора при выравнивании полей записи и определении размера записи.
    Более того, Борланд следует приведенному алгоритму и во вложенных структурах.
    Ошибок не обнаружено :)

    Там же я сделал предположение, зачем потребовался такой не совсем очевидный алгоритм определения размера записи.
    Здесь у Борланда все сходится идеально.
  • tesseract © (06.06.08 19:37) [75]

    > зачем потребовался такой не совсем очевидный алгоритм определения
    > размера записи.


    Может связано с оптимизацией работы кучи ?
  • Anatoly Podgoretsky © (07.06.08 01:18) [76]
    Я уже писал, для оптимизации компилятора и частично работы.
    Так писать проще, достаточно провести анализ только для первой переменной, остальные автоматическу получаются выровнеными.
  • KSergey © (07.06.08 09:42) [77]
    Может и не в тему
    http://forum.sources.ru/index.php?showtopic=110906

    Формально по ссылке наверное написано правильно, но, если честно, моему осознанию сильно мешает то, что автор не привел свое толкование примененных теринов.
    На сколько я смог понять, между словами "выравнивание" и "размер" у него подразумевается знак равенства.
  • KSergey © (07.06.08 11:45) [78]
    > KSergey ©   (07.06.08 09:42) [77]
    > Формально по ссылке наверное написано правильно,

    Беда только в том, что не про дельфи :)
    Но это обсуждение натолкнуло меня на мысль, что в дельфи у автора оно как-то примерно так же устроено, похоже.
 
Конференция "Основная" » Насколько адекватен SizeOf
Есть новые Нет новых   [134491   +8][b:0.001][p:0.001]