информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Именно. В стандарте очень много оставлено либо полностью на... 21.11.05 13:43  Число просмотров: 1577
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Получается, что все от компилятора зависит и нет стандартов
> на выравнивание...
> (Хотя программисту это не очень то и надо знать.)

Именно. В стандарте очень много оставлено либо полностью на откуп реализации либо заданы какие то условия. Например: по фигу как будет реализован std::list, главное, чтобы он предоставлял операции вставки/удаления элементов в любое место за константное время, предоставлял прямые и реверсивные итераторы, операция произвольного доступа - необязательна. То же самое об остальных контейнерах библиотеки. Или к примеру стандарт ничего не говорит об абсолютных размерах базовых типов, вводится только ограничение
sizeof(char) == 1 (все остальные длины меряются в размерах char-а, а не в байтах)
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

Таких примеров до фига

> Для чего нужно выравнивание - для увеличения скорости
> работы за счет увеличения скорости доступа к памяти. Елиб
> не было архитектур на которых выигрыш есть, то никто о
> выравнивании границ и не говорил, поскольку не было бы
> пользы кроме вреда - нерачительного использования памяти.

Полностью согласен.

> Если после какой-то степени двойки эффект отпадает, то и
> нечего позря эту память выделять. То есть если эффект после
> 4 байт пропадает, то нет смысла выравнивать на 8 байтовцю
> границу, не смотря на "lond double". Глубоко убежден, что

Почему то msvc выравнивает. Может какое то преимущество и есть - не знаю

> мало какие компиляторы доберуться до 8 байтового
> выравнивания. И что самое удивительное есть такие, которые
> плюют на слово "long" в сочетании "long double".

На самом деле это тоже отдано на откуп реализации. С базовыми типами с плавающей запятой та же ситуация, что и с целочисленными:

sizeof(float) <= sizeof(double) <= sizeof(long double)

Никто не ЗАСТАВЛЯЕТ делать long double 10-байтовым на всех архитектурах.

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

Не совсем понял. Имеется в виду выравнивание по началу кеш-строки? (16 байт)

> когда структура передается в качестве аргумента.

Передавать большие данные по значению - вообще достаточно неразумно. В частности именно поэтому в C НЕВОЗМОЖНО передать массив по значению. Даже если явно указано

void f(int arr[10]);

вызов

int a[10];
f(a)

будет передан по указателю (проверял по ассемблерным листингам). И это задано в стандарте.

> Что касается примера, то структуру из трех байтовых
> элементов очень даже имеет смысл выравнить до слова -
> ЗНАЧИТЕЛЬНО быстрее будет обрабатываться ее возврат из
> функции.

А принимаемые/возвращаемые значения всегда выравниваются по 4 байта (по крайней мере на msvc). Например в функции

char f(char c1, char c2, char c3);

Аргументы в стековом фрейме будут занимать не 3 байта (и даже не 4), а 12. И возвращаться будет через eax (опять таки для msvc/x86)
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach