达夫设备介绍

  1. fallthrough关键字
    知乎关于through的链接:https://zhuanlan.zhihu.com/p/359069621
    fallthroguh在switch中应用,在case分支中有时需要添加break,在一些特定的代码为了实现功能选择不添加breakthrough关键字,但是编译器可能会因为没有添加fallthrough关键字来warning,fallthrough可以让编译器在看到case分支后边没有使用break的情况下不抛出警告;
#include<iostream>
int main()
{
	int a = 3;
	switch (a % 5)
	{
		case 1:a++;
		case 2:a++;
		case 3:a++; 
		case 4:a++;
	}
	std::cout << a << std::endl;
	return 0;
}

output: a=5;

在分支运行后,因为没有break,会接着运行下边分支的语句;

  1. 达夫设备
    在for循环中,为了尽量减少循环条件的耗时,就需要使用达夫设备;
    1)例子1
#include<iostream>
#include<vector>
using namespace std;
int main()
{
	constexpr size_t buffsize = 1000;
	vector<int> buffer(buffsize, 0);
	for (size_t i = 0; i < buffsize; i++)
	{
		buffer[i] = i;
	}
	size_t max_num = buffer[0];
	for (size_t i = 0; i < buffsize; i+=8)
	{
		max_num = (buffer[i] > max_num) ? buffer[i] : max_num;
		max_num = (buffer[i+1] > max_num) ? buffer[i+1] : max_num;
		max_num = (buffer[i+2] > max_num) ? buffer[i+2] : max_num;
		max_num = (buffer[i+3] > max_num) ? buffer[i+3] : max_num;
		max_num = (buffer[i+4] > max_num) ? buffer[i+4] : max_num;
		max_num = (buffer[i + 5] > max_num) ? buffer[i + 5] : max_num;
		max_num = (buffer[i + 6] > max_num) ? buffer[i + 6] : max_num;
		max_num = (buffer[i + 7] > max_num) ? buffer[i + 7] : max_num;
	}
	cout << max_num << endl;
	return 0;
}

output: 999
如果buffsize为1001,那么代码就会出错,我们想达到的效果是输出1000
  1. 例子2
#include<iostream>
#include<vector>
using namespace std;
int main()
{
	constexpr size_t buffsize = 1001;
	vector<int> buffer(buffsize, 0);
	for (size_t i = 0; i < buffsize; i++)
	{
		buffer[i] = i;
	}
	size_t max_num = buffer[0];
	for (size_t i = 0; i+8< buffsize; i+=8)
	{
		max_num = (buffer[i] > max_num) ? buffer[i] : max_num;
		max_num = (buffer[i+1] > max_num) ? buffer[i+1] : max_num;
		max_num = (buffer[i+2] > max_num) ? buffer[i+2] : max_num;
		max_num = (buffer[i+3] > max_num) ? buffer[i+3] : max_num;
		max_num = (buffer[i+4] > max_num) ? buffer[i+4] : max_num;
		max_num = (buffer[i + 5] > max_num) ? buffer[i + 5] : max_num;
		max_num = (buffer[i + 6] > max_num) ? buffer[i + 6] : max_num;
		max_num = (buffer[i + 7] > max_num) ? buffer[i + 7] : max_num;
	}
	
	for (size_t j = buffsize / 8* 8; j < buffsize; j++)
	{
		max_num = buffer[j] > max_num ? buffer[j] : max_num;
	}
	cout << max_num << endl;
	return 0;
}

output:1000

3)例子3

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	constexpr size_t buffsize = 1001;
	vector<int> buffer(buffsize, 0);
	for (size_t i = 0; i < buffsize; i++)
	{
		buffer[i] = i;
	}
	size_t max_num = buffer[0];
	auto ptr = buffer.begin();
	for (size_t i = 0; i+8< buffsize; i+=8)
	{
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
	}

	for (size_t j = buffsize / 8* 8; j < buffsize; j++)
	{
		max_num = buffer[j] > max_num ? buffer[j] : max_num;
	}
	cout << max_num << endl;
	return 0;
}

4) 例子4

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	constexpr size_t buffsize = 1001;
	vector<int> buffer(buffsize, 0);
	for (size_t i = 0; i < buffsize; i++)
	{
		buffer[i] = i;
	}
	size_t max_num = buffer[0];
	auto ptr = buffer.begin();
	for (size_t i = 0; i+8< buffsize; i+=8)
	{
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
	}

	switch (buffsize % 8)
	{
		case 7: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;[[fallthrough]];
		case 6: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;[[fallthrough]];
		case 5: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;[[fallthrough]];
		case 4: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;[[fallthrough]];
		case 3: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;[[fallthrough]];
		case 2: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;[[fallthrough]];
		case 1: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
	}
	cout << max_num << endl;
	return 0;
}

5) 例子5

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	constexpr size_t buffsize = 1001;
	vector<int> buffer(buffsize, 0);
	for (size_t i = 0; i < buffsize; i++)
	{
		buffer[i] = i;
	}
	size_t max_num = buffer[0];
	auto ptr = buffer.begin();
	switch (buffsize % 8)
	{
		case 0: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
		case 7: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
		case 6: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
		case 5: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
		case 4: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
		case 3: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
		case 2: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
		case 1: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
	}
	for (size_t i = 0; i<buffsize-1)/8; i+=8)
	{
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
	}
	cout << max_num << endl;
	return 0;
}
  1. 达夫设备
    switch里边套循环
#include<iostream>
#include<vector>
using namespace std;
int main()
{
	constexpr size_t buffsize = 1001;
	vector<int> buffer(buffsize, 0);
	for (size_t i = 0; i < buffsize; i++)
	{
		buffer[i] = i;
	}
	size_t max_num = buffer[0];
	auto ptr = buffer.begin();
	size_t i = 0;
	switch (buffsize % 8)
		for (; i < (buffsize + 7) / 8; i++)
		{
			[[fallthrough]];
			case 0: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
			case 7: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
			case 6: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
			case 5: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
			case 4: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
			case 3: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
			case 2: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++; [[fallthrough]];
			case 1: max_num = (*ptr > max_num) ? (*ptr) : max_num; ptr++;
		}

	cout << max_num << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星光技术人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值