clang优化器的一个问题

| 1 Comment | No TrackBacks |

今天的一个偶然的发现。FreeBSD clang version 3.6.1 (tags/RELEASE_361/final 237755) 20150525。clang 3.8 2015/07/20 的版本同样有此问题。

之前, FreeBSD 上 strndup(3) 的实现是这样的:

char *
strndup(const char *str, size_t n)
{
	size_t len;
	char *copy;

	len = strnlen(str, n);
	if ((copy = malloc(len + 1)) == NULL)
		return (NULL);
	memcpy(copy, str, len);
	copy[len] = '\0';
	return (copy);
}

而 OpenBSD 上的实现,则是这样的:

char *
strndup(const char *str, size_t maxlen)
{
	char *copy;
	size_t len;

	len = strnlen(str, maxlen);
	copy = malloc(len + 1);
	if (copy != NULL) {
		(void)memcpy(copy, str, len);
		copy[len] = '\0';
	}

	return copy;
}

检查 clang 输出的结果,发现 clang 优化后,FreeBSD 版本会比 OpenBSD 版本多一个 xor %eax, %eax (amd64),显然是为了 return (NULL),从而多出两个字节。而 GCC 则将两份源代码编译成同样的结果(因为在这个 if block 中,已经知道 copy == NULL,因此并不需要将 %rax 清零)。

No TrackBacks

TrackBack URL: https://blog.delphij.net/mt/mt-tb.cgi/1973

1 Comment

由于摩尔定律一直有效,这样的优化的商业价值每18个月减半,过去几十年也得算上。

Leave a comment

Monthly Archives

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 5.2.11