小编NoS*_*tAl的帖子

为什么要声明一个constexpr

在观看isocpp.org上链接C++ 11教程视频时,我注意到了一些事情:

constexpr int windowWidth{800}, windowHeight{600};
Run Code Online (Sandbox Code Playgroud)

声明这些int变量有什么意义constexpr,而不仅仅是const

constexpr c++11

5
推荐指数
2
解决办法
484
查看次数

如何获取存储在unique_ptr中的数组大小?

如果我做:

std::unique_ptr<int[]> uparr(new int[1984]);
Run Code Online (Sandbox Code Playgroud)

我传递uparr给某人而没有传递1984给他们,他们能看到它有多少元素?
对于数组的unique_ptr,又是vector的.size()吗?

arrays stdvector unique-ptr c++11

5
推荐指数
2
解决办法
4523
查看次数

出版魔法静态线程安全吗?

想象一下,我有这个:

const string& get_name()
{
static auto* ptr_name=new string("Ron");
return *ptr_name;
}
Run Code Online (Sandbox Code Playgroud)

如果多个线程正在调用get_name是否是UB?

static thread-safety c++11

5
推荐指数
1
解决办法
1816
查看次数

imul和idiv在8086上到底是如何工作的?

我试图弄清楚 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的。如果有人能为我说明这些差异,我将非常感激。

谢谢!

binary x86 assembly negative-number twos-complement

5
推荐指数
1
解决办法
1万
查看次数

为什么map <bool,int> m = {{1,2},{3,4},{5,0}}; 1号而不是3号?

相当特殊:

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

c++ stdmap uniform-initialization c++11

5
推荐指数
3
解决办法
442
查看次数

为什么数字10用于引用整数类型0?

以下代码:

#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++

5
推荐指数
1
解决办法
178
查看次数

在此代码中计算十进制数字的*1233 >> 12背后的数学是什么

我对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的逻辑,并且你需要调整精确值,但乘法对我来说是一个谜.

c++ optimization unsigned bit-manipulation fmt

5
推荐指数
1
解决办法
251
查看次数

C++ ABI如何处理RVO和NRVO?

我很困惑与问候如何编译和链接处理的事实,在电话会议上要求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:

  1. 调用get_string()
  2. get_string结果现在在堆栈上,调用者使用它来构造s

现在还有RVO

  1. 调用get_string()
  2. 当get_string完成时,堆栈上没有结果,get_string构造为s,调用者不需要做任何事情来构造s.

c++ abi rvo nrvo

5
推荐指数
1
解决办法
394
查看次数

C++标准是否允许在没有开销的情况下实现std :: optional <double>

我刚刚看了cppcon谈论Bloomberg数据,这种变体类型使用IEEE754格式的冗余来编码存储在数据中的类型.

所以我想知道C++标准是否允许实现通过使用相同的技巧更有效地实现std :: optional.

请注意,这将要求有时存储在optional中的double的二进制表示与传递给构造函数的double的二进制表示不匹配.

注意:我关心标准允许这个与否,我知道大多数/所有实现都不会打扰.

我知道IEEE754不是标准规定的,但它是允许的,并且可以通过实现来检查.

c++ floating-point ieee-754 c++17 stdoptional

5
推荐指数
1
解决办法
454
查看次数

类模板参数推导是否适用于 std::map?

我试图让 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变得复杂?

c++ templates c++17

5
推荐指数
1
解决办法
178
查看次数