Alternate way of computing size of a type using pointer arithmetic

前端 未结 9 456
广开言路
广开言路 2021-01-12 04:53

Is the following code 100% portable?

int a=10;
size_t size_of_int = (char *)(&a+1)-(char*)(&a); // No problem here?

std::cout<

        
9条回答
  •  攒了一身酷
    2021-01-12 05:24

    &a+1 will lead to undefined behavior according to the C++ Standard 5.7/5:

    When an expression that has integral type is added to or subtracted from a pointer, the result has the type of the pointer operand. <...> If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.

    &a+1 is OK according to 5.7/4:

    For the purposes of these operators, a pointer to a nonarray object behaves the same as a pointer to the first element of an array of length one with the type of the object as its element type.

    That means that 5.7/5 can be applied without UB. And finally remark 75 from 5.7/6 as @Luther Blissett noted in his answer says that the code in the question is valid.


    In the production code you should use sizeof instead. But the C++ Standard doesn't guarantee that sizeof(int) will result in 4 on every 32-bit platform.

提交回复
热议问题