在观看isocpp.org上链接的C++ 11教程视频时,我注意到了一些事情:
constexpr int windowWidth{800}, windowHeight{600};
Run Code Online (Sandbox Code Playgroud)
声明这些int变量有什么意义constexpr,而不仅仅是const?
如果我做:
std::unique_ptr<int[]> uparr(new int[1984]);
Run Code Online (Sandbox Code Playgroud)
我传递uparr给某人而没有传递1984给他们,他们能看到它有多少元素?
对于数组的unique_ptr,又是vector的.size()吗?
想象一下,我有这个:
const string& get_name()
{
static auto* ptr_name=new string("Ron");
return *ptr_name;
}
Run Code Online (Sandbox Code Playgroud)
如果多个线程正在调用get_name是否是UB?
我试图弄清楚 8086 微处理器的 imul 和 idiv 指令是如何工作的。
我知道这一点: 1. mul 和 div 是无符号数的乘法和除法 2. imul 和 idiv,也是有符号数的乘法和除法
我搜索了整个网络,上面写的内容是我找到的唯一信息,但以不同的方式编写。
我有这个:
mov AX, 0FFCEh
idiv AH
Run Code Online (Sandbox Code Playgroud)
因为 ah 是一个字节,AL=AX/AH(结果)且 AH=余数
在指令之后,我得到AX=0032h,显然余数为 0,结果为 32。有人能解释一下它是如何得到这个结果的吗?我需要知道如何解释指令是如何工作的(一点一点)。
imul 指令也是如此。
我有:
mov AX, 0FF10h
imul AL
Run Code Online (Sandbox Code Playgroud)
因为AL是一个字节,所以乘法的结果将保存到AX中。执行 imul 指令AX=0100h后,为什么不是 F100h ?
我不知道CPU实际上是如何执行mul、div、imul和idiv的。如果有人能为我说明这些差异,我将非常感激。
谢谢!
相当特殊:
map<bool,int> mb={{1,2},{3,4},{5,0}};
cout << mb.size();
map<int,int> mi={{1,2},{3,4},{5,0}};
cout << mi.size();
Run Code Online (Sandbox Code Playgroud)
打印出来
13
以下代码:
#include <iostream>
#include <limits>
#include <cstdint>
int main()
{
std::cout << std::numeric_limits<std::uint64_t>::digits10 << "\n"
<< std::numeric_limits<std::uint64_t&>::digits10 << "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出
19
0
我希望std::uint64_t&它具有相同的价值std::uint64_t:这种差异是否有原因?
我对C++ fmtlib的这个简短函数如何工作有点困惑.
inline std::uint32_t digits10_clz(std::uint32_t n) {
std::uint32_t t = (32 - __builtin_clz(n | 1)) * 1233 >> 12;
return t - (n < powers_of_10_u32[t]) + 1;
}
Run Code Online (Sandbox Code Playgroud)
我理解你可以使用log2(log10)来估计log10的逻辑,并且你需要调整精确值,但乘法对我来说是一个谜.
我很困惑与问候如何编译和链接处理的事实,在电话会议上要求ER功能的依靠,如果函数使用静脉阻塞或NRVO不同.
这可能是我的误解,但我的假设是通常没有RVO或NRVO
std::string s = get_string();
Run Code Online (Sandbox Code Playgroud)
如果get_string不执行N?RVO但是如果get_string执行N?RVO调用代码什么也不做,并且s由函数get_string构造到位,则涉及从get_string的结果移动构造s .
编辑:这是我如何设想get_string调用程序操作,如果没有N?RVO:
现在还有RVO
我刚刚看了cppcon谈论Bloomberg数据,这种变体类型使用IEEE754格式的冗余来编码存储在数据中的类型.
所以我想知道C++标准是否允许实现通过使用相同的技巧更有效地实现std :: optional.
请注意,这将要求有时存储在optional中的double的二进制表示与传递给构造函数的double的二进制表示不匹配.
注意:我关心标准允许这个与否,我知道大多数/所有实现都不会打扰.
我知道IEEE754不是标准规定的,但它是允许的,并且可以通过实现来检查.
我试图让 CTAD 与 一起工作std::map,但我无法让它工作。
#include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
using namespace std::string_literals;
int main() {
std::vector v{1,2,3}; // ok
std::map m{{4, "four"s},{7,"seven"s},{1,"one"s},{5,"five"s}}; // error
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让它工作,或者让它工作std::map变得复杂?