void * всегда достаточно большой, чтобы содержать указатель на адресуемую память. Любое другое использование строго запрещено бейсбольной ассоциацией высшей лиги.
Пример: dec-10 представлял собой 36-битную архитектуру с 36-битными словами. Тем не менее, адреса были 18 бит, и вы можете хранить 2 указателя в любом регистре / слове.
Да, это крайний пример. Если вы должны сделать математику с указателями, sizeof действителен; но выполнение математических указателей на любом другом объекте, кроме непрерывного массива, сложнее, чем хитрое.
Наконец - никогда не используйте 'void *' для хранения указателя на объект или указателя на член в C ++. Многие реализации компиляторов фактически используют несколько «физических» указателей для реализации множественного наследования конкретных (или частично конкретных) классов. В действительности это почти никогда не происходит, потому что очень немногие люди используют множественное наследование таким образом, а когда они это делают, очень редко срезают и не срезают указатели. Когда это происходит, очень трудно понять, что произошло.