size_t は符号なしであるため、負の値は許可されません。time_t は私の知る限り符号付きであるため、size_t に -1 を割り当てることができます。ただし、 time_t については完全にはわかりません。ヘッダー ファイルの定義に従うと、次のようになります。
typedef __time_t time_t;
、次にここに:
__STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */
そして最後に
#define __TIME_T_TYPE __SYSCALL_SLONG_TYPE
__SYSCALL_SLONG_TYPEが何であるかはよくわかりませんが、 signed long だと思います。残念ながら、このトレースを行った後でも、他の C++11 プラットフォームにも同じ実装があることを願うばかりです。これが合法であり、それらすべてに対して明確に定義されているかどうかはまだわかりません。
size_t foo = -1;
もちろん、time_t を符号付きにすることは理にかなっています。たとえば、タイム ゾーンをモデル化するために、負の時間オフセットを持つことができるからです。しかし一方で、1970 年以降は数えるべき秒数が多いため、署名なしにすることは理にかなっています。したがって、常識はどちらの方向にも当てはまります :) time_t でグーグル検索すると、次のように返されました。
「歴史的な理由から、これは通常、1970 年 1 月 1 日 UTC の 00:00 時間から経過した秒数を表す整数値 (つまり、UNIX タイムスタンプ) として実装されます。ただし、ライブラリは別の時間表現を使用してこの型を実装する場合があります。」
ソース: http://www.cplusplus.com/reference/ctime/time_t/
および同じページで:「移植可能なプログラムは、この型の値を直接使用するべきではありませんが、標準ライブラリの要素への呼び出しに常に依存して、それらを移植可能な型に変換する必要があります。」
そのため、time_t はすべてのシステムで明確に定義されているわけではありませんが、time() は time_t: を返すため、インターフェイスでそれをエクスポートするのは初めてではありません。他にどのタイプを使用すればよいですか?
以下の2つの理由でお願いしています。
- 速度: struct tmのような構造体を使用すると、より多くのバイトがあるため、それをコピーしたり、別の struct tm と比較したりすると、long で同じことを行うよりも遅くなります。
- 順序付け:日付の高速なデータ型が必要です。これにより、a < b を実行して、日付 a と b のどちらが最初に来るかを判断できます。
質問: time_t はすべてのプラットフォームで明確に定義された時間表現ではないため、(1) 高速で、(2) 互換性があり、使用できるデータ型はどのようなものですか?
たとえば、time_t の順序については、次のようになります。
#include <iostream>
#include <ctime>
#include <cstring>
int main() {
struct tm tm_a, tm_b;
memset(&tm_a, 0, sizeof(struct tm));
memset(&tm_b, 0, sizeof(struct tm));
if(strptime("2014-01-01 12:00:00", "%Y-%m-%d %H:%M:%s", &tm_a) && strptime("2014-01-01 11:59:59", "%Y-%m-%d %H:%M:%s", &tm_b)) {
if(mktime(&tm_a) > mktime(&tm_b)) std::cout << "time_t ordering OK." << std::endl;
else std::cout << "time_t ordering tainted" << std::endl;
} else std::cout << "failed to parse time" << std::endl;
return 0;
}
time_tはすべてのプラットフォームで汚染されませんか?