web-dev-qa-db-fra.com

Quel est le type de retour d'opérateur sizeof?

Quel est le type de retour d'opérateur sizeof? cppreference.com & msdn dit que sizeof renvoie size_t. Retourne-t-il vraiment un size_t? J'utilise VS2010 Professional et je cible le x64.

int main()
{
    int size   = sizeof(int);     // No warning
    int length = strlen("Expo");  //warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
    return 0;
}

J'ai cette question parce que la première ligne n'émet aucun avertissement, tandis que la seconde le fait. Même si je le change en taille char, je ne reçois aucun avertissement.

38
Coder777

C++ 11, §5.3.3 ¶6

Le résultat de sizeof et sizeof... est une constante de type std::size_t. [Remarque: std :: size_t est défini dans l'en-tête standard (18.2). - note de fin]

Vous pouvez également effectuer une vérification rapide:

#include <iostream>
#include <typeinfo>
#include <cstdlib>

int main()
{
    std::cout<<(typeid(sizeof(int))==typeid(std::size_t))<<std::endl;
    return 0;
}

qui génère correctement 1 sur ma machine.

Comme @ Adam D. Ruppe l'a dit dans le commentaire, le compilateur ne se plaint probablement pas car, puisqu'il connaît déjà le résultat, il sait qu'une telle "conversion" n'est pas dangereuse

27
Matteo Italia

size_t est un alias d'un type intégral non signé défini par l'implémentation. En C++ opposé à C où l'opérateur sizeof peut être appliqué aux tableaux VLA, l'opérande de l'opérateur sizeof n'est pas évalué (au moment de l'exécution). C'est une constante. Si la valeur de l'opérateur sizeof peut être adaptée au type int, le compilateur n'émet pas d'avertissement. Dans le deuxième exemple, std :: strlen est évalué au moment de l'exécution afin que son résultat ne puisse pas tenir dans int, le compilateur émet un avertissement. Vous pouvez remplacer std:; strlen par votre propre fonction constexpr (une fonction récursive). Dans ce cas, si le résultat peut tenir dans int, je pense que le compilateur n'émettra pas d'avertissement.

4
Vlad from Moscow

L'opérateur sizeof est utilisé pour obtenir la taille des types ou des variables en octets. Renvoie un type entier non signé d'au moins 16 bits. Il est utilisé pour obtenir la portabilité.

Cet avertissement est dû à l'entier non signé où est défini size_t.

1
dpossamai