为什么è¦è¿”回é™æ€æŒ‡é’ˆè€Œä¸æ˜¯outå‚数?

时间:2019-07-09 11:22:45

标签: c time.h

char* asctime (const struct tm * timeptr);
char* ctime (const time_t * timer);

我å‘现time.h内的许多函数都返回指å‘é™æ€å˜é‡çš„指针,这些é™æ€å˜é‡å¯ä»¥é€šè¿‡å¯¹è¿™äº›å‡½æ•°çš„任何åŽç»­è°ƒç”¨æ¥æ›´æ”¹ã€‚è¿™æ„味ç€æˆ‘å¿…é¡»å¤åˆ¶åˆšå¾—到的数æ®ï¼Œè¿™æ˜¯æˆ‘必须执行的é¢å¤–æ“作,这会使这些函数æˆä¸ºçº¿ç¨‹ä¸å®‰å…¨çš„。

为什么以这ç§æ–¹å¼å®žæ–½ï¼Ÿè¿™äº›ç­¾å会更好å—?

void asctime (char * out, const struct tm * timeptr);
void ctime (char * out, const time_t * timer);

在开å‘过程中,我们始终必须åšå‡ºå†³å®šã€‚我åªæ˜¯åœ¨é—®ä¸ºä»€ä¹ˆä»–们选择返回é™æ€æŒ‡é’ˆè€Œä¸æ˜¯å°†â€œè¾“出å˜é‡â€ä½œä¸ºå‚数。

顺便说一å¥ï¼ˆè¿™æ˜¯å¦ä¸€ä¸ªé—®é¢˜ï¼‰ï¼Œä¸ºä»€ä¹ˆä»–们ä¸å°†ç»“果分é…到堆上?是å…许使用任何东西代替malloc还是åªæ˜¯ä¸ºäº†æ高效率?

4 个答案:

答案 0 :(得分:22)

ctimeå’Œasctime函数的规范å¯ä»¥è¿½æº¯åˆ°C89,那时的情况有所ä¸åŒï¼Œä¸»è¦æ˜¯å› ä¸ºå¤šå¤„ç†å™¨ç³»ç»Ÿä¸æ˜¯å¾ˆæ™®é,因此使用é™æ€ç¼“冲区ä¸ä¼šé€ æˆå¤§é—®é¢˜ã€‚

最有å¯èƒ½çš„是,它们ä¸è¿”回动æ€åˆ†é…的内存,因为这è¦èŠ±è´¹é¢å¤–的时间,并且在那些日å­é‡ŒCPU周期更难实现。

如果您使用的是Linux之类的POSIX系统,则还有å¦å¤–两个å¯ç”¨çš„功能,这些功能基本上就是您æ述的替代功能:

   char *asctime_r(const struct tm *tm, char *buf);
   char *ctime_r(const time_t *timep, char *buf);

这些函数采用一个指å‘å¯ä»¥æŽ¥æ”¶è¾“出的缓冲区的指针(它们返回一个指å‘该缓冲区的指针)。 _råŽç¼€çš„æ„æ€æ˜¯â€œå¯é‡å…¥â€ï¼Œè¿™æ„味ç€å¯ä»¥åœ¨å¤šçº¿ç¨‹ç¨‹åºä¸­å®‰å…¨åœ°è°ƒç”¨å®ƒï¼Œä¹Ÿå¯ä»¥å¤šæ¬¡è°ƒç”¨è€Œä¸å¿…在两者之间æ’å…¥åºåˆ—å·ã€‚

答案 1 :(得分:12)

  

è¿™æ„味ç€æˆ‘å¿…é¡»å¤åˆ¶åˆšå¾—到的数æ®

为什么需è¦å¤åˆ¶å®ƒï¼Ÿ

请注æ„,å³ä½¿æ‚¨åœ¨èŽ·å¾—æ•°æ®åŽç«‹å³å¤åˆ¶äº†æ•°æ®ï¼Œæ‚¨ä»ç„¶å¯ä»¥å‚加比赛。

  

为什么è¦è¿™æ ·å®žçŽ°ï¼Ÿ

由于标准化(1989),å³ä½¿è‡ªå¤§åž‹æœºæ—¶ä»£èµ·å°±å­˜åœ¨å¤šçº¿ç¨‹ï¼Œå¤§å¤šæ•°è½¯ä»¶ä¹Ÿä¸æ˜¯å¤šçº¿ç¨‹çš„。作为å‚考,甚至比这些功能晚了几年(1996)æ‰ä½¿POSIX线程标准化。直到æ¯å¹´2001-2006æ‰å‡ºçŽ°è®¡ç®—机,并且æ¯å¹´éƒ½æ²¡æœ‰å‡ºçŽ°å¤šæ ¸/ SMT处ç†å™¨ã€‚

如果需è¦å…¶ä»–功能,则å¯ä»¥å§‹ç»ˆä½¿ç”¨ç³»ç»Ÿç‰¹å®šçš„功能。

  

为什么ä¸å°†ç»“果分é…到堆上?

分é…éžå¸¸æ˜‚贵。

  

是å…许使用任何东西代替malloc还是åªæ˜¯ä¸ºäº†æ高效率?

ä¸ç¡®å®šæ‚¨çš„æ„æ€ã€‚正确的方法是将指针传递到目标缓冲区,以便用户选择è¦ä½¿ç”¨çš„分é…方法。

答案 2 :(得分:6)

(几乎)您将æè¿°C11中添加的_så˜ä½“

errno_t ctime_s(char *buffer, rsize_t bufsz, const time_t *time);
errno_t asctime_s(char *buf, rsize_t bufsz, const struct tm *time_ptr);

如果指定的ä½ç½®è¶³å¤Ÿå¤§ï¼Œè¿™äº›å†…容将写入指定的ä½ç½®ï¼Œå¦åˆ™å°†æŠ¥å‘Šé”™è¯¯ã€‚

您ä¸éœ€è¦mallocæ¥è¿›è¡Œè¿™äº›è°ƒç”¨çš„缓冲区,因为您知é“char buf[26];正是需è¦çš„。

答案 3 :(得分:5)

C是1970年代åˆçš„产å“,这ç§é—产在这ç§äº‹æƒ…上得到了体现。 strtok也使用é™æ€ç¼“冲区,既ä¸æ˜¯çº¿ç¨‹å®‰å…¨çš„,也ä¸æ˜¯å¯é‡å…¥çš„。

对于这些功能为何以这ç§æ–¹å¼å®žçŽ°ï¼Œæˆ‘还没有明确的解释。å¯èƒ½æ˜¯ä¸ºäº†èŠ‚çœå †æ ˆç©ºé—´ï¼ˆå½“æ—¶128 kB是很多éžå¸¸æ˜‚贵的内存),å¯èƒ½æ˜¯ä¸ºäº†é¿å…对目标缓冲区的大å°æˆ–有效性进行è¿è¡Œæ—¶æ£€æŸ¥ï¼Œç­‰ç­‰ã€‚C最åˆæ˜¯ä¸ºç³»ç»Ÿç¼–程设计的,因此,如果è¦è¿›è¡Œå¤§é‡çš„时间计算,则å¯ä»¥çœ‹åˆ°è¿™ç§æ–¹æ³•åœ¨ä¸€å¤©ä¸­èŠ‚çœäº†å¤§é‡çš„周期。

ä¸å¹¸çš„是,这是我的推测。我åŒæ„传递目标缓冲区是更好的解决方案,这应该是å‰è¿›çš„é“路。