Преамбула: я хочу преобразовать указатель в целочисленный тип, например. для проверки выравнивания. uintptr_t
кажется правильным, но он гарантирован только в C, а не в С++ (или С++ 11)
Для следующего кода:
#include <stdint.h>
#ifndef I_WONDER_IF_UINTPR_T_IS_DEFINED
typedef unsigned long uintptr_t;
#endif
template <typename T>
bool isAligned(unsigned char* p) ///Checks alignment with respect to some data type
{
return !((uintptr_t) p % sizeof(T));
}
template bool isAligned<uint16_t>(unsigned char* p);
template bool isAligned<uint32_t>(unsigned char* p);
template bool isAligned<uint64_t>(unsigned char* p);
2 вопроса:
- Есть ли волшебное и гарантированное слово, которое я могу использовать, где я положил
I_WONDER_IF_UINTPR_T_IS_DEFINED
? - Должен ли я просто использовать
unsigned long
и забыть об этом?
Сгенерированная сборка (при наличии uintptr_t): http://goo.gl/4feUNK
Примечание 1: Я знаю, чем в С++ 11 Я должен использовать alignof
вместо sizeof
Примечание 2: Я знаю об этом обсуждении: <cstdint> vs < stdint.h >