[C++ 学习笔记 4] Duff's Device(switch 和 for 穿插)

看了 asio 的 \src\tests\latency\tcp_server.cpp 代码,被 coroutine 的 reenter 和 yield 的实现给震精到了……switch 和 for 穿插着,这居然也行,还有个学名叫“Duff's Device”!赶快写个测试代码,证明它是对的:

void foo(int n)
{
	printf_s("---- %d ----\n", n);
	switch (n) {
		for (;;)
	case 0:
		if (1) {
			printf_s("0\n");
			break;
		} else
	case 1:
		printf_s("1\n");
		break;
	default:
		printf_s("default\n");
		break;
	}
}

int main()
{
	foo(0);
	foo(1);
	return 0;
}

顺利编译,输出是:

---- 0 ----
0
---- 1 ----
1
0

好像不容易看懂,但是加上一些 {} 就容易了:

void foo(int n)
{
	printf_s("---- %d ----\n", n);
	switch (n) {
		for (;;) {
	case 0:
			if (1) {
				printf_s("0\n");
				break;
			} else {
	case 1:
				printf_s("1\n");
			}
		}
		break;
	default:
		printf_s("default\n");
		break;
	}
}

大神的代码不容置疑,以下代码追求减少循环测试的执行次数。

void duff_memcpy(char* to, char* from, size_t count)
{
	size_t n = (count + 7) / 8;
	switch (count % 8) {
	case 0: do { *to++ = *from++;
	case 7: *to++ = *from++;
	case 6: *to++ = *from++;
	case 5: *to++ = *from++;
	case 4: *to++ = *from++;
	case 3: *to++ = *from++;
	case 2: *to++ = *from++;
	case 1: *to++ = *from++;
	} while (--n > 0);
	}
}

第一轮用 switch 选择进入点,以后每轮都是复制 8 字节。

扩展阅读:

《Asio 协程详解》https://www.avboost.com/t/asio/771

 

转载于:https://my.oschina.net/umu618/blog/821720

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值