2017-02-15 2 views
2

Dans gcc 4,84 dans le fichier /usr/include/c++/4.8 nous avonsPourquoi le type de représentation pour chrono :: nanosecondes est-il un type entier signé?

namespace std 
{ 
    typedef duration<int64_t, nano>  nanoseconds; 

Pourquoi le type de représentation pour nanoseconde un type entier signé? Pourquoi n'est-ce pas non signé? quand pouvons-nous avoir un objet de durée avec une valeur négative?

+3

Lorsque vous soustrayez un point de temps d'un dans son passé. –

+1

Peut-être que la durée négative peut représenter 'before 'à partir d'un certain point de temps. –

Répondre

6

Si deux objets a et b sont définis de sorte que a - b est une durée, il est souhaitable d'avoir a - b = -(b - a).

Pour implémenter cette propriété anti-commutative, la durée doit être signée.

3

Il est non seulement la mise en œuvre gcc, il est requis par la norme ([time.syn]):

typedef duration<signed integer type of at least 64 bits,  nano> nanoseconds; 

Une durée représente une différence de temps entre deux points de temps A et B. Si A> B , la durée est positive, sinon c'est négatif, donc c'est tout à fait logique.

7

quand peut-on avoir un objet de durée avec une valeur négative?

Chaque fois que vous voulez représenter une durée négative!

par exemple. "Dix secondes plus tôt" serait std::chrono::seconds(-10) et si vous ajoutez cela à time_point t alors vous obtenez un time_point qui est dix secondes avant t.

La norme dit "Un type duration mesure le temps entre deux points dans le temps (time_points)." Il ne dit pas qu'il peut seulement mesurer le temps entre les points de temps non décroissants. Cela signifie donc qu'il peut être utilisé pour mesurer le temps entre t1 et t2 même si t2 < t1. Et pour le faire simplement, vous avez besoin d'une valeur négative. Si les durées ne peuvent pas être signées, alors, pour représenter un décalage qui signifie "plus tôt" pas "plus tard", vous devrez utiliser quelque chose comme std::pair<bool, duration> où le bool indique s'il s'agit d'un décalage positif ou négatif, puis vous auriez à faire:

chrono::time_point adjust(chrono::time_point t, pair<bool, duration> offset) 
{ 
    if (offset.first) // positive 
    return t + offset.second; 
    else // negative 
    return t - offset.second; 
} 

Ceci est stupide. Le langage et le matériel supportent déjà cela beaucoup plus expressivement et efficacement, en utilisant des entiers signés.

+0

Merci pour la réponse. – MichaelMoser