- 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,会接着运行下边分支的语句;
- 达夫设备
在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。
- 例子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;
}
- 达夫设备
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;
}