Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЯ рассуждаю так. У нас есть определённая адресация реализованная для заданной ОС, потому я точно знаю, сколько байт занимает адрес(т.е. мы имеем константу для размера адреса памяти). Потому указатель, при прогнозируемом нормальном поведении, должен занимать константный объём памяти. Хотя эти рассуждения пустяк, ибо стандарт говорит обратное. Или стандарт просто не даёт гарантии ? Так стандарт и не должен давать гарантии. Если есть закон запрещающий воровать, то это не значит что люди не будут воровать. Тонкие моменты, хотя казалось бы что ответ очевиден Если-бы ты смотрел в историю строительства вычислительной техники (Процессоры, адресная шина, шина данных и универсальная шина) то не так бы бил "поклоны" на стандарт. Это документ который создавался в догонку к господствующей архитектуре. Вот я кодил на asm/tasm для IBM/PC. И на асмах для Электроники БК и Z-80. Там нет понятия указатель. Есть разные целые числа 16/32/64 bit которые рассматривают как относительные, абсолютные и прочие косвенные способы указать на ячейку памяти. В современных motherboards EМНИП универсальная шина адресует от 36 до 48 bit памяти (пускай знающие поправят если я ошибся). Последня цифра позволяет адресовать 280 терабайт физ. ячеек. И адресная модель не связана как 1:1 с разрядностью процессора. Это вообще отдельная тема. Указатель - это попытка уйти от Assembler-like кодинга и подойти к универсальному способу описания адреса без сведений о самом целом которое оно представляет. Сам по себе физический смысл целого числа - неприемлим. Например безсмысленно складывать два значения указателя. А знания о том сколько занимает разрядная сетка. Зачем? Сериализовать его на диск? К чему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 11:55 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
mayton, AFAIK не правы Вы Вы смотрите на low low low уровень. Z80 и прочее. Вроде в "продвинутых" архитектурах типа Эльбруса, к созданию которых Бабаян примазывался, была аж защита памяти на уровне данных. Т.е. явно тип указателя в самом указатели кодить приходилось. Как минимум, читал статью, о советском стековом процессоре, где так же тип указателя и модель адресации кодировалась. Специально вроде под язык Module 2 заточенный. И, вроде, показывали прирост производительности на стандартных американских тестах, за счет переноса реализации защиты и управления типами на ядро процессора Если брать современное. Java работает по такому же принципу. Стековая архитектура + типизация данных. Такие принципы не с бухты барахты у вундеркиндов Sun'а родились. Все уже давно было Сам с таким не сталкивался, как и с ЭВМ на основе троичной системы счисления (была и такая в СССР). Но все это конец 70-80-ые годы. AFAIK И понятие указатель в ASM был всегда. А то странно "относительные, абсолютные и прочие косвенные способы указать на ячейку памяти " есть, а "указателя" нет. Это как в анекдоте про маленького мальчика "жопа есть, а слова нету". IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 12:06 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevAFAIK И понятие указатель в ASM был всегда. А то странно "относительные, абсолютные и прочие косвенные способы указать на ячейку памяти " есть, а "указателя" нет.IMHOНу и где в прямой или регистровой адресации указатель? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 12:10 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
Я говорю о том что если разработчик пытается спуститься на левел "разрядности" указателя то возникает вопрос что он дальше с ним будет делать? У меня был свой интерес например в 64 битных указателях искать неспользуемые биты. Инкапсулировать нечто вроде RTTI прямо в указатель. Но эта задача выходила за рамки программирования на стандартном "С". Она в своей постановке уже говорила сама за себя что это будет гибридная разработка. С + Asm. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 12:12 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
maytonУ меня был свой интерес например в 64 битных указателях искать неспользуемые биты.Архитектура x86-64 определяет, что в двенадцати старших неиспользуемых битах должны быть или все нули или все единицы, а маскировать их перед загрузкой из памяти в регистры - себе дороже. IMHO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 12:18 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovmaytonУ меня был свой интерес например в 64 битных указателях искать неспользуемые биты.Архитектура x86-64 определяет, что в двенадцати старших неиспользуемых битах должны быть или все нули или все единицы, а маскировать их перед загрузкой из памяти в регистры - себе дороже. IMHO. +1 Умная тема. Пойду покачаю доки на тему x86-64. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 12:21 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
AMD64 Architecture Programmer’s Manual Volume 1: Application Programming :64-bit Canonical Addresses Long mode defines 64 bits of virtual address, but implementations of the AMD64 architecture may support fewer bits of virtual address. Although implementations might not use all 64 bits of the virtual address, they check bits 63 through the most-significant implemented bit to see if those bits are all zeros or all ones. An address that complies with this property is said to be in canonical address form. If a virtual-memory reference is not in canonical form, the implementation causes a general-protection exception or stack fault. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 12:37 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
Саша, в стандарте только гарантия, что-то char один байт и констрейнты, укладывающие все типы данных в неубывающую последовательность по размеру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 12:37 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, похоже моя шняга взлетает только на Спектрумах. Спс за ссылку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 12:45 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
maytonпохоже моя шняга взлетает только на Спектрумах.Не только - борланд (тоже) использовал старший бит в своём рантайме. Что (потом) создало проблемы с выделением процессу двух и более гигабайт памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 12:47 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
IBM/360 ещё не упоминали, где старший байт можно использовать по своему усмотрению(после последующих расширений правда один бит остался) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 13:18 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
maytonЭто документ который создавался в догонку к господствующей архитектуре. над этим я конечно подумаю. Мы так и не ответили на главный вопрос. При нормальном поведении системы, отсутствии undefined behavior, в конкретной операционной системе, может ли указатель в С/С++ на разные объекты занимать разный объём памяти. Если да, то приведите пожалуйста конкретный пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 13:59 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
SashaMercurymaytonЭто документ который создавался в догонку к господствующей архитектуре. над этим я конечно подумаю. Мы так и не ответили на главный вопрос. При нормальном поведении системы, отсутствии undefined behavior, в конкретной операционной системе, может ли указатель в С/С++ на разные объекты занимать разный объём памяти. Если да, то приведите пожалуйста конкретный пример. Я думаю что в 99.9% современных компилляторов используется единая memory model. Физически это будет либо 32 либо 64 бита и без "миксов" внутри ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 14:32 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryХотя вот вам ещё пример. Код: plaintext 1. 2. в чём разница ? Поскольку a[10] - это указатель на int, то int* a[10] - это указатель на указатель на int, то есть int **a, насколько я понял. При увеличении этого указателя на 1, он сдвинется на количество байт равное длине указателя. А int (*b) [10] это указатель на 10 целых int, при увеличении его на 1, он сдвинется на sizeof(int)*10 байт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 14:33 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETSashaMercuryХотя вот вам ещё пример. Код: plaintext 1. 2. в чём разница ? Поскольку a[10] - это указатель на int, то int* a[10] - это указатель на указатель на int, то есть int **a, насколько я понял. При увеличении этого указателя на 1, он сдвинется на количество байт равное длине указателя. А int (*b) [10] это указатель на 10 целых int, при увеличении его на 1, он сдвинется на sizeof(int)*10 байт.a - указатель на массив из 10 элементов типа int, b - массив из 10 указалей на int ))) и это мы ещё не добрались до указаелей на массивы указателей на функции ( принимающие в качестве параметров указатели на функции ) ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 14:37 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
SashaMercury.NET Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 1.Что вам не нравится в этой функции с точки зрения функционала ? 2. В каком случае она сработает некорректно ? 1. Все нравится. 2. Незнаю. Может если только *a и *b ссылаются на пересекающиеся участки памяти. ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 14:39 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
egorych.NETпропущено... Поскольку a[10] - это указатель на int, то int* a[10] - это указатель на указатель на int, то есть int **a, насколько я понял. При увеличении этого указателя на 1, он сдвинется на количество байт равное длине указателя. А int (*b) [10] это указатель на 10 целых int, при увеличении его на 1, он сдвинется на sizeof(int)*10 байт.a - указатель на массив из 10 элементов типа int, b - массив из 10 указалей на int ))) и это мы ещё не добрались до указаелей на массивы указателей на функции ( принимающие в качестве параметров указатели на функции ) ))) точно ?;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 14:40 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryв конкретной операционной системе, может ли указатель в С/С++ на разные объекты занимать разный объём памяти. Если да, то приведите пожалуйста конкретный пример.да ё, размер указателя зависит от платформы, а не от языка. Поэтому, если платформа имеет указатели разного размера, то и язык, на ней реализованный, должен это позволять. Пример от WhiteOwl это никакой не UB, а вполне себе допустимая ситуация на 16-разрядных DOS ( и Windows16, кстати, тоже ). Стандарт не может постулировать размер указателя, очевидно же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 14:44 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryточно ?;)может и наоборот ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 14:45 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
egorychSashaMercuryточно ?;)может и наоборот ;) :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 14:53 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETSashaMercuryпропущено... 1.Что вам не нравится в этой функции с точки зрения функционала ? 2. В каком случае она сработает некорректно ? 1. Все нравится. 2. Незнаю. Может если только *a и *b ссылаются на пересекающиеся участки памяти. ) 1.Хорошо, я подкорректирую первый вопрос. Что вам не нравится с точки зрения алгоритма (не затрагиваются вопросы скорости ) 2. Может быть ;) Приведите уже пример, тут вариантов не много, касаемо того что вы написали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 14:56 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NET, по первому вопросу вам никак не может всё нравится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 14:58 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Если a и b один и тот же адрес, то данные по нему обнулятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 15:18 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETSashaMercury, Если a и b один и тот же адрес, то данные по нему обнулятся. fe Код: plaintext 1. 2. действительно так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 15:26 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
Фу блин. Бином Ньютона.... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 15:33 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38806122&tid=2019233]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 139ms |

| 0 / 0 |
