Тип с плавающей точкой того же размера, что и указатель - PullRequest
2 голосов
/ 28 июня 2011

Можете ли вы рассчитывать на то, что полу-современный процессор сможет выполнять вычисления с плавающей запятой с размером данных, равным указателю?Существует ли определенный тип (возможно, в заголовочном файле для конкретной платформы) для такого типа?Я за эффектом intptr_t, но для чисел с плавающей запятой.

Редактировать: я имею в виду не тип C float, а вообще числа с плавающей запятой.

Редактировать: сделатьМне нужно просто запустить скрипт, проверить, какие размеры float, double и void * соответствуют используемому компилятору, и сгенерировать соответствующий файл заголовка для typedef типа, который использует другой код?

Ответы [ 3 ]

4 голосов
/ 28 июня 2011

Ближайшее, что вы получите:

union floatptr_t {
    float f;
    void *p;
};

С другой стороны, это не совсем то, что вы просили.С другой стороны, это 100% стандарт ...

[править]

Да, вы можете использовать sizeof, чтобы сравнить размер указателя с float, doublelong double, и выберите один.Но как @R.указывает на то, что многие значения указателя будут сопоставлены с NaN, поэтому вы не сможете ничего сделать с этими значениями с плавающей запятой, кроме как приведения их обратно к указателю ... И даже это не гарантируется (хотя, вероятно,на практике).

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

2 голосов
/ 29 июня 2011

Это, безусловно, очень распространено, поскольку «полу-современные» процессоры в значительной степени имеют CHAR_BIT 8 и размер указателя объекта либо 4, либо 8, и почти все поддерживают IEEE float (32 бита = 4 байта) и double (64 бита = 8 байт). Таким образом, обычно будет тип того же размера. Без сомнения, есть некоторые «странные» архитектуры

Но, как указывает R .. в комментарии, это не обязательно означает, что все значения типа указателя могут быть представлены плавающим типом, потому что не все битовые комбинации являются допустимыми значениями (и некоторые из них допустимыми являются NaN, и IIRC, когда вы назначаете NaN, результатом, безусловно, является NaN, но это, безусловно, не тот же NaN). Так что этот тип не получает эффект intptr_t.

1 голос
/ 28 июня 2011

A float (иначе говоря, одинарная точность) составляет 4 байта, поэтому ... да, может быть.

Обратите внимание, что не все 4-байтовые значения являются действительными числами с плавающей запятой, некоторые являются NaN, а не числом.

Тон вашего вопроса заставляет меня думать, что вы слышали что-то об атомарных операциях над объектами размером с шину процессора.Если это так, тогда DON'T do it, используйте явные атомарные операции.Они делают для более читабельного кода и меньше ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...