LINUX.ORG.RU

Ответ на: Тогда уже от bk_

>sizeof(_anything_ *) == sizeof(_anyother_ *)

В общем случае размер указателя разных типов в некоторых системах может быть разным, если разные типы по-разному адресуются. Например, 8-битный указатель портов и 16-битный указатель данных. Или быстрый 16-битный внутрисегментный указатель и медленный 32-х битный указатель сегмент-смещение.

KRoN73 ★★★★★
()
Ответ на: комментарий от bk_

>Ок, тогда чему _всегда_ равно sizeof(void *) == sizeof(????) ? Или нет такого?

Можно безопасно полагать, что sizeof(size_t) >= sizeof(void*)

dmitry_vk ★★★
()
Ответ на: комментарий от bk_

нет такого. если хочешь хранить указатель в целочисленной переменной, используй (u)intptr_t. но то, что sizeof(void *) == sizeof(intptr_t) стандарт не гарантирует.

arsi ★★★★★
()
Ответ на: комментарий от dmitry_vk

> Можно безопасно полагать, что sizeof(size_t) >= sizeof(void*)

нет. например, в 16-битном х86 полный адрес — 32-битный, но в некоторых моделях адресации (small, емнип) size_t — 16-битный.

arsi ★★★★★
()

> sizeof(unsigned long) == sizeof(void *) ?

С чего бы?

tensai_cirno ★★★★★
()
Ответ на: комментарий от drBatty

> тип ptr_diff

не знаю такого типа.

> похоже ТС хочет именно этого. Не?

я хз, что хочет ТС, у меня была двойка по телепатии.

arsi ★★★★★
()
Ответ на: комментарий от arsi

я хз, что хочет ТС, у меня была двойка по телепатии.

у мну трояк. из этого

sizeof(unsigned long) == sizeof(void *) ?

следует, что тс хочет(?) вычитать указатели. А ptrdiff_t как раз тот самый тип, который имеет РАЗНОСТЬ УКАЗАТЕЛЕЙ (одного типа ессно).


#include <cstddef>

int main()
{
	int x[] = {1,2,3};
	int *p1 = &x[0];
	int *p2 = &x[2];
	std::ptrdiff_t d = p2 - p1;
	return d;
}

ответ 2 :)

ЗЫЖ вроде и без плюсов с ц99 работало. не помню...

drBatty ★★
()
Ответ на: комментарий от Kosyak

>А разве это не сглаживается libc

Э... libc, это, как бы, очень конкретная библиотека для вполне конкретных архитектур :)

компилятором?


Вот, как раз, в некоторых хитрых платформах у Си-компилятора и есть такие извращения. На x86/ARM/DEC/68K/etc мир не заканчивается ;) Впрочем, вариант со смешанными far* near* указателями и на x86 был.

KRoN73 ★★★★★
()

> Я правильно понимаю, это правило выполняется всегда?

Нет. Читайте стандарт.

Kirakishou
()

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

anonymous
()

А что именно тебе нужно?

Deleted
()
Ответ на: комментарий от Gorthauer

Тогда autotools && несложные проверки для правильного определения u?intptr_t и макросов для printf/scanf. В принципе, там никакого rocket science нет.

kemm
()
Ответ на: комментарий от anonymous

> идиоты, на Си надо писать под конкретную платформу, это слишком низкоуровневый язык, для кроссплатформенности
Торвальдс с удивлением смотрит на анонимуса

svu ★★★★★
()
Ответ на: комментарий от tensai_cirno

И даже это глупость. Надо просто быть аккуратным и следовать спекам, не делая допущений, которых в спеках нет.

svu ★★★★★
()
Ответ на: комментарий от arsi

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

kemm
()

неправильно понимаешь. нет такого правила.

nanoo_linux
()
Ответ на: комментарий от arsi

Да ну? А 7.18.1.4 о чём говорит? Или месье предлагает однозначность преобразования void * => intptr_t и обратно при sizeof(intptr_t) < sizeof(void *)?

kemm
()
Ответ на: комментарий от kemm

> А 7.18.1.4 о чём говорит?

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

> Или месье предлагает однозначность преобразования void * => intptr_t и обратно при sizeof(intptr_t) < sizeof(void *)?

а что смущает? что для некоторой платформы указатель может содержать избыточную информацию?

arsi ★★★★★
()
Ответ на: комментарий от arsi

Что указатель может иметь явно избыточный размер. Хотя да, стандарту это не противоречит, был неправ.

kemm
()
Ответ на: комментарий от bk_

> Приведи пример такой платформы.

какой вывод ты сделаешь, если не приведу пример реальной платформы?

arsi ★★★★★
()
Ответ на: комментарий от arsi

Что ты не можешь дать пример реальной платформы.

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

А какой смысл там приводить пару сегмент:смещение к целому типу, если арифметика с ним работать не будет?

madcore ★★★★★
()
Ответ на: комментарий от madcore

Да никакого смысла нет, вопрос только для улучшения моего понимания предмета.

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

> 8086? Внутрисегментная и межсегментная адресация?

лолшто? у меня случился SIGSEGV, бэктрейс:
bk_> 8086? Внутрисегментная и межсегментная адресация?
arsi>> x86.
bk_>>> Приведи пример такой архитектуры, пожалуйста.
arsi>>>> нет, если _anything_* указатель на данные, _anyother_* — на функцию.
bk_>>>>> sizeof(_anything_ *) == sizeof(_anyother_ *)
arsi>>>>>> sizeof(void *) == sizeof(char *), всегда.
bk_>>>>>>> чему _всегда_ равно sizeof(void *) == sizeof(????) ?

arsi ★★★★★
()
Ответ на: комментарий от bk_

> В каких таких случаях указатель на функцию больше указателя на переменную?

я уже не помню точно, как назывались эти модели распределения памяти… medium, compact или как-то так… были near(16bit) code + far(32bit) data и far code + near data… ну и остальные, где указатель на код занимал столько же, как указатель на данные. +pseudo-linear (huge model), но это уже совершенно другая история.

arsi ★★★★★
()
Ответ на: комментарий от arsi

> medium, compact или как-

tiny, small, medium, compact, large & huge.

Указали на данные и код свободно прыгали в размерах между 16 и 32 битами, их комбинации давали вышеперечисленные модели.


+pseudo-linear (huge model),


huge ничего общего не имеет с «pseudo-linear». В этой модели смещения были 32 бита.

LamerOk ★★★★★
()

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

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.