Разумно предположить, что в общем случае размеры указателей любого типа (включая указатели на функции) равны битам целевой архитектуры
Зависит. Если вы стремитесь к быстрой оценке потребления памяти, этого может быть достаточно.
(включая указатели на функции)
Но вот одно важное замечание. Хотя большинство указателей будет иметь одинаковый размер, указатели на функции могут отличаться. Не гарантируется, что void*
сможет содержать указатель на функцию. По крайней мере, это верно для C. Я не знаю о C ++.
Так что мне было интересно, какие будут такие обстоятельства, если таковые имеются?
Может быть множество причин, по которым он отличается. Если правильность ваших программ зависит от этого размера, НИКОГДА не стоит делать такие предположения. Проверьте это вместо этого. Это не должно быть трудно.
Вы можете использовать этот макрос для проверки таких вещей во время компиляции в C:
#include <assert.h>
static_assert(sizeof(void*) == 4, "Pointers are assumed to be exactly 4 bytes");
При компиляции выдается сообщение об ошибке:
$ gcc main.c
In file included from main.c:1:
main.c:2:1: error: static assertion failed: "Pointers are assumed to be exactly 4 bytes"
static_assert(sizeof(void*) == 4, "Pointers are assumed to be exactly 4 bytes");
^~~~~~~~~~~~~
Если вы используете C ++, вы можете пропустить #include <assert.h>
, потому что static_assert
является ключевым словом в C ++. (И вы можете использовать ключевое слово _Static_assert
в C, но оно выглядит ужасно, поэтому используйте вместо него include и макрос.)
Поскольку эти две строки очень легко включить в ваш код, нет НИКАКИХ оправданий, если вы не будете правильно работать с неверным размером указателя.