
[Glen Fernandes]
Only what was reported for the RC:
Was this reported on Connect? I didn't see any bug reports filed against the STL.
1. For x86 and x64: std::alignment_of<std::nullptr_t>::value is 1, yet compiler aligns at 4 2. For x86: std::alignment_of<T Class::*>::value is 4, yet compiler aligns at 8 For x64: std::alignment_of<T Class::*>::value is 8, yet compiler aligns at 4 3. For x86: std::alignment_of<T (Class::*)()>::value is 4, yet compiler aligns at 8 For x64: std::alignment_of<T (Class::*)()>::value is 8, yet compiler aligns at 4
I am observing discrepancies with nullptr_t on x86/x64 and PMDs on x64 only, but not with PMFs. I've filed DevDiv#1202506 "alignof reports inaccurate values" with the repro at the end of this mail. If you can demonstrate x86 PMD failure, or x86/x64 PMF failure, I'll add that to the bug report.
I haven't checked the RTM yet, but apparently VC12's std::alignment_of for the relevant types reported the same value that the compiler chose to align objects of those types.
Yeah, that's because 2013 used library-only tech, and 2015 uses alignof as required/depicted by the Standard. Thanks, STL C:\Temp>type meow.cpp #ifdef _MSC_VER #pragma warning(disable: 4127) // conditional expression is constant #endif #include <stddef.h> template <typename T> struct RemoveReference { typedef T type; }; template <typename T> struct RemoveReference<T&> { typedef T type; }; template <typename T> struct RemoveReference<T&&> { typedef T type; }; template <typename T> struct GetAlign { T elem0; char elem1; T elem2; }; template <typename T> struct AlignmentOf { using U = typename RemoveReference<T>::type; static const size_t value = sizeof(GetAlign<U>) - 2 * sizeof(U); }; struct Meow { }; #include <cstddef> #include <iostream> using namespace std; template <typename T> void print(const char * const name) { cout << name << endl; cout << "AlignmentOf<T>::value = " << AlignmentOf<T>::value << endl; cout << " alignof(T) = " << alignof(T); if (AlignmentOf<T>::value != alignof(T)) { cout << " <== FAIL"; } cout << endl << endl; } #define PRINT(X) print<X>(#X) int main() { PRINT(char); PRINT(short); PRINT(int); PRINT(long); PRINT(long long); PRINT(float); PRINT(double); PRINT(int *); using PMD = int Meow::*; using PMF = int (Meow::*)(int); PRINT(nullptr_t); PRINT(PMD); PRINT(PMF); } [x86] C:\Temp>cl /EHsc /nologo /W4 /MTd meow.cpp meow.cpp C:\Temp>meow char AlignmentOf<T>::value = 1 alignof(T) = 1 short AlignmentOf<T>::value = 2 alignof(T) = 2 int AlignmentOf<T>::value = 4 alignof(T) = 4 long AlignmentOf<T>::value = 4 alignof(T) = 4 long long AlignmentOf<T>::value = 8 alignof(T) = 8 float AlignmentOf<T>::value = 4 alignof(T) = 4 double AlignmentOf<T>::value = 8 alignof(T) = 8 int * AlignmentOf<T>::value = 4 alignof(T) = 4 nullptr_t AlignmentOf<T>::value = 4 alignof(T) = 1 <== FAIL PMD AlignmentOf<T>::value = 4 alignof(T) = 4 PMF AlignmentOf<T>::value = 4 alignof(T) = 4 [x64] C:\Temp>cl /EHsc /nologo /W4 /MTd meow.cpp meow.cpp C:\Temp>meow char AlignmentOf<T>::value = 1 alignof(T) = 1 short AlignmentOf<T>::value = 2 alignof(T) = 2 int AlignmentOf<T>::value = 4 alignof(T) = 4 long AlignmentOf<T>::value = 4 alignof(T) = 4 long long AlignmentOf<T>::value = 8 alignof(T) = 8 float AlignmentOf<T>::value = 4 alignof(T) = 4 double AlignmentOf<T>::value = 8 alignof(T) = 8 int * AlignmentOf<T>::value = 8 alignof(T) = 8 nullptr_t AlignmentOf<T>::value = 8 alignof(T) = 1 <== FAIL PMD AlignmentOf<T>::value = 4 alignof(T) = 8 <== FAIL PMF AlignmentOf<T>::value = 8 alignof(T) = 8