Если на моей машине sizeof (long) == sizeof (long long), почему они не одного типа?

Если я бегу:

#include <type_traits>
#include <iostream>

int main()
{
std::cout << "sizeof(long) = " << sizeof(long) << "\n";
std::cout << "sizeof(long long) = " << sizeof(long long) << "\n";
std::cout << "std::is_same<long, long long>::value = "<< std::boolalpha << std::is_same<long, long long>::value
<< "\n";
return 0;
}

на моей машине (и на колиру) я получить:

sizeof(long) = 8
sizeof(long long) = 8
std::is_same<long, long long>::value = false

И это не просто std::is_same<>; переводчики, ожидающие инстанцирования для int64_t потерпеть неудачу, потому что я скомпилировал только для int а также long long int в другом переводчике, несмотря на то, что все происходит на одной машине.

Почему эти типы не одинаковы? Я имею в виду, демонстрируя поведение, как вы бы из typedefтого же типа?

0

Решение

Это правило языка и важно для мобильности.

int, long, а также long long все рассматриваются языком как разные типы, даже если они имеют одинаковое количество байтов и схему дополнения.

Это намеренно. Это означает, что вы можете написать код, который может компилироваться на разных платформах, где размер типов различается.

Было бы очень неприятно, если, например, две перегрузки

void foo(int f)

а также

void foo(long f)

были обработаны как одна и та же функция на одной платформе и различные перегрузки на другой.

7

Другие решения

Точно так же эта программа:

#include <type_traits>
#include <iostream>

int main()
{
using ::std::cout;
using ::std::is_same;
using ::std::boolalpha;

cout << "sizeof(long) = " << sizeof(long) << "\n";
cout << "sizeof(long long) = " << sizeof(long long) << "\n";
cout << "sizeof(double) = " << sizeof(double) << "\n";
cout << "::std::is_same<long, long long>::value = "<< boolalpha << is_same<long, long long>::value
<< "\n";
std::cout << "::std::is_same<long, double>::value = "<< boolalpha << is_same<long, double>::value
<< "\n";
return 0;
}

выводит это:

sizeof(long) = 8
sizeof(long long) = 8
sizeof(double) = 8
::std::is_same<long, long long>::value = false
::std::is_same<long, double>::value = false

Как вы видете, double а также long Похоже, они имеют одинаковую длину, почему они не являются просто определениями типов одного типа?

0

По вопросам рекламы [email protected]