【发布时间】:2018-05-04 06:18:45
【问题描述】:
问题
我对@987654321@ 进行了一些关于std::optional 的测试,令我惊讶的是,它似乎表现得像一个指针,即使它在标准中有所说明(§23.6.3) 它应该包含它:
不允许实现使用额外的存储空间(例如动态内存)来分配其包含的值。
测试
我测试的完整代码在这个编译器探索器sheet 上,虽然我不知道它还能持续多久。这就是为什么我将在这里描述我所做的测试。
我在测试什么
我正在做两个测试,每个测试一个函数:
- 检查值是否存在
- 检查值是否存在,如果存在则检索它,否则为 67780
我使用-O2 minimum 和 --std=c++17 作为 x86_64 目标的 gcc 7.2 和 clang 5.0.0 on 的编译器标志。这里复制的结果来自clang。
使用std::optional
检查
代码:
bool check(const std::optional<int> maybe_int) {
return maybe_int.has_value();
}
结果:
mov al, byte ptr [rdi + 4]
ret
一个间接。
检索
代码:
int retrieve(const std::optional<int> maybe_int) {
if(maybe_int.has_value())
return maybe_int.value();
else
return 67780;
}
结果:
cmp byte ptr [rdi + 4], 0
je .LBB1_1
mov eax, dword ptr [rdi]
ret
.LBB1_1:
mov eax, 67780
ret
一个间接用于检查,一个用于检索。
使用自定义类
类
template<typename T>
class my_optional {
private:
T val;
bool has_val;
public:
/* Constuctors ... */
bool has_value() const {
return has_val;
}
decltype(auto) value() const {
return val;
}
};
检查
代码:
bool check(const my_optional<int> maybe_int) {
return maybe_int.has_value();
}
结果:
shr rdi, 32
test dil, dil
setne al
ret
无间接。
检索
代码:
int retrieve(const my_optional<int> maybe_int) {
if(maybe_int.has_value())
return maybe_int.value();
else
return 67780;
}
结果:
movabs rax, 1095216660480
test rdi, rax
mov eax, 67780
cmovne eax, edi
ret
虽然我不知道它是如何工作的,但它没有任何间接性。
问题
标题或“我的测试有什么问题?”
【问题讨论】:
标签: c++ assembly x86-64 c++17 c++-standard-library