2012-02-13 3 views
1

Я хочу определить указатель большого размера (64 бит или 128 бит) в gcc, который не зависит от платформы. Я думаю, что в MSDN есть что-то вроде __ptr128 или __ptr64.указатель большого размера в gcc

sizeof(__ptr128) is 16 bytes. 
sizeof(__ptr64) is 8 bytes. 

Возможно ли это?

Это может быть полезно, когда вы используете функции ядра в 64-битной ОС, для которой требуется 8-байтовый указатель-указатель, и у вас есть 32-разрядное приложение, которое использует 32-разрядный адрес и вы хотите использовать эту функцию ядра.

+3

Как именно вы собираетесь использовать указатель, который больше вашего адресного пространства? – user57368

+0

Как объясняет @adelphus в своем [ответе ниже] (http://stackoverflow.com/a/9262508/180174), определение размера указателя в зависимости от платформы не имеет смысла. При этом существует тип '__int128' для 128-битных целых чисел в GCC 4.6 (но не старше). – Kimvais

+0

Я сказал __ptr128 не __int128 –

ответ

7

Ваш вопрос не имеет смысла. Указатели, по определению, являются адресом памяти на что-то - размер должен зависеть от платформы. Как бы вы разыменовали 128-битный указатель на аппаратной платформе, поддерживающей 64-битную адресацию ?!

Вы можете создать 64 или 128-битные значения , но указатель непосредственно связан с схемой адресации памяти базового оборудования.

EDIT

С вашим дополнительным заявлением, я думаю, я вижу, что вы пытаетесь сделать. К сожалению, я сомневаюсь, что это возможно. Если функция ядра, которую вы хотите использовать, принимает 64-битный аргумент указателя, она, скорее всего, будет 64-битной функцией (если вы не разрабатываете какое-то необычное оборудование).

Даже если это технически возможно смешивать 64-битные инструкции в 32-битный исполняемый файл, ни один компилятор не позволит вам это сделать. 64-битный вызов API будет использовать 64-битный код, 64-битные регистры и 64-битный стек - было бы крайне неудобно, чтобы компилятор и операционная система могли управлять произвольным переключением с 32-разрядной среды на 64-разрядную Окружающая среда.

Вы должны посмотреть на поиск эквивалентного API для 32-разрядной среды. Возможно, вы могли бы разместить прототип функции ядра (имя + параметры), который хотите использовать, и кто-то может помочь вам найти лучшее решение.

Просто так что нет никакой путаницы, __ptr64 в MSDN это не зависит от платформы:

На 32-битной системе, указатель, объявленный с __ptr64 обрезается до 32-битного указателя .

+0

, он может быть полезен, когда вы используете функции ядра в 64-битной ОС, которая требует 8 байтов указателя и у вас есть 32-разрядное приложение, которое использует 32-битный адрес, и вы хотите использовать эту функцию ядра. –

+1

Итак, что вы _really_ хотите, это 32/64 бит указателя, а не 128-разрядный указатель. Во всяком случае, это всего лишь 64-разрядный указатель (с верхней половиной нуля для 32 бит ...). Или, просто указатель_, потому что в 32-битной системе у вас не может быть 64-битного указателя, который не является полностью фиктивным, а в 64-битной системе указатель в любом случае уже имеет 64 бита. Из-за чего все усилия начинаются с абсурда. Или, если вы параноик о прокладке/выравнивании структуры, вы можете обернуть 'void *' и 'uint64_t' в объединение с соответствующими операторами преобразования. – Damon

+0

Да! я думаю так. но мне нравится иметь более подробную информацию и пример, если есть! –

0

Невозможно прокомментировать, но утверждение, что вы не можете использовать 64-битные инструкции в «32-битном исполняемом файле», вводит в заблуждение, поскольку определение «32-разрядный исполняемый файл» интерпретируется. Если вы имеете в виду исполняемый файл, который использует 32-битные указатели, то ничего не говорится о том, что вы не можете использовать инструкции, которые управляют 64-битными значениями при использовании 32-битных указателей. Процессор не знает разницы.

Linux даже поддерживает режим, в котором вы можете иметь 32-битное пользовательское пространство и 64-битное пространство ядра. Таким образом, каждое приложение имеет доступ к 4 ГБ ОЗУ, но система может получить доступ гораздо больше. Это уменьшает размер ваших указателей до 4 байтов, но не ограничивает использование 64-битных манипуляций с данными.

Смежные вопросы