从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态。
每周更新
周刊项目地址 github,在线地址 | discord讨论群组 |飞书讨论群组|知乎专栏 |
---|
欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue
MOVAPS & vmovdqa
这两条指令,支持 128 bit 的操作,同时要求 16B 地址对齐,如果违反对齐规则,就会触发 SEGV。 对于 GCC 来说,在x86-64
下,默认 march 是x86-64
,具有最好的兼容性,其支持 SSE 指令。可以通过gcc -Q --help=target | grep -- '-march='
来查看 GCC 默认 march 属性。 对于Sandy Bridge
架构,至少支持AVX
,XSAVE
等指令。 所以,我们可以看到,编译选项开了-march=sandybridge
之后,使用上了 AVX 指令。 同时,如果不开编译器优化,那么使用 mov 指令来完成 4 字节的搬迁,开启 O2 优化,会使用对应的 SSE 或者 AVX 指令来优化 mov 操作。
struct foo {
foo() = default;
foo(const foo&) { throw 42; }
};
int main() {
std::variant<int, foo> v{42};
assert(not v.valueless_by_exception());
try {
v = foo{}; // throws
} catch(...) { }
assert(v.valueless_by_exception());
}
这段代码没啥问题
std::vector<int> create_range()
{
return {1, 2, 3, 4, 5};
}
int main()
{
for (auto const& value : create_range())
{
std::cout << value << ' ';
}
}
这段代码有问题
std::vector<int> create_range()
{
return {1, 2, 3, 4, 5};
}
std::vector<int> const& f(std::vector<int> const& v)
{
return v;
}
int main()
{
for (auto const& value : f(create_range()))
{
std::cout << value << ' ';
}
}
Range-for中的range是个万能引用/右值引用,f是constT& 绑定不上,所以这里是未定义行为, 解决方法,别偷懒,放到循环外面
看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你的评论非常重要!也可以帮忙点赞收藏转发!多谢支持!
This site is open source. [Improve this page](https://github.com/wanghenshui/cppweeklynews/edit/dev/posts/014.md).