小编Shi*_*hah的帖子

为什么不总是将返回值赋给const引用?

假设我有一些功能:

Foo GetFoo(..)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

假设我们既不知道这个函数是如何实现的,也不知道Foo的内部结构(例如,它可能是非常复杂的对象).但是我们知道函数正在按值返回Foo,并且我们希望将此返回值用作const.

问题:将此函数的返回值存储为总是一个好主意const &吗?

const Foo& f = GetFoo(...);
Run Code Online (Sandbox Code Playgroud)

代替,

const Foo f = GetFoo(...);
Run Code Online (Sandbox Code Playgroud)

我知道编译器会返回值优化,可能会移动对象而不是复制它,所以最终const &可能没有任何优势.不过我的问题是,有什么缺点吗?为什么不应该只发展肌肉的内存总是使用const &存储因为我不必依赖于编译器优化和事实,即使移动操作可以为复杂的对象昂贵的返回值.

将此扩展到极端,为什么我不应该总是使用const &我的代码中不可变的所有变量?例如,

const int& a = 2;
const int& b = 2;
const int& c = c + d;
Run Code Online (Sandbox Code Playgroud)

除了更冗长,还有什么缺点吗?

c++

34
推荐指数
3
解决办法
4982
查看次数

如何使matplotlib图像看起来像这样专业?

默认的matplotlib图看起来真的没有吸引力,甚至不专业.我尝试了几个软件包,包括seaborn和prettyplotlib,但这两个方案几乎都没有改进样式.

到目前为止,我已经开始使用seaborn包了:

在此输入图像描述

以下是我正在寻找的外观与上述相差甚远:

在此输入图像描述

请注意第二个示例中的以下好处:

  1. 图表下方的区域充满了令人赏心悦目的色彩.
  2. 图形线是思想家,很好地脱颖而出.
  3. 轴线是思想家,再次很出色.
  4. 曲线下面积是透明的.
  5. X轴刻度标记更密集.

我的问题是:你认为上面是某种流行的主题或风格,我可以在matplotlib中快速使用吗?或者,如果我可以从一些包中使用?如果不这样做,那么将这种风格设定为我的全球偏好吗?如果失败了,是否有可能在matlibplot中这样做?

谢谢!

python plot data-visualization matplotlib

14
推荐指数
3
解决办法
2万
查看次数

我不了解PID控制器的积分部分

我不理解PID控制器的组成部分.让我们假设来自维基百科的这个伪代码:

previous_error = 0
integral = 0 
start:
  error = setpoint - measured_value
  integral = integral + error*dt
  derivative = (error - previous_error)/dt
  output = Kp*error + Ki*integral + Kd*derivative
  previous_error = error
  wait(dt)
  goto start
Run Code Online (Sandbox Code Playgroud)

积分在开始时设置为零.然后在循环中它整合了错误随着时间的推移.当我对测量值或设定值进行(正)变化时,误差将变为正值,积分将在整个时间内(从头开始)"吃掉"值.但我不明白的是,当误差稳定回零时,积分部分仍然会有一些值(随时间积分的误差),并且仍然会对控制器的输出值有所贡献,但它不应该.

请问有人解释一下吗?

controller integral control-theory pid-controller

11
推荐指数
2
解决办法
2万
查看次数

错误:某些 NCCL 操作失败或超时

在 4 个 A6000 GPU 上运行分布式训练时,出现以下错误:

[E ProcessGroupNCCL.cpp:630] [Rank 3] Watchdog caught collective operation timeout: WorkNCCL(OpType=BROADCAST, Timeout(ms)=1800000) ran for 1803710 milliseconds before timing out.       
                                                                                                                                                        [E ProcessGroupNCCL.cpp:390] Some NCCL operations have failed or timed out. Due to the asynchronous nature of CUDA kernels, subsequent GPU operations might run on corrupted/incomplete data. To avoid this inconsistency, we are taking the entire process down.                                                                                 

terminate called after throwing an instance of 'std::runtime_error'                                                                                                        
what():  [Rank 2] Watchdog caught collective operation timeout: 
WorkNCCL(OpType=BROADCAST, Timeout(ms)=1800000) ran …
Run Code Online (Sandbox Code Playgroud)

python distributed gpu pytorch nvidia-docker

7
推荐指数
2
解决办法
2万
查看次数

Python布尔字节大小

显然整数在 Python 中需要 24 个字节。我可以理解这样做是因为表示无限数字的额外花里胡哨。然而,看起来布尔数据类型也花费了 24 个字节,即使它可能只代表两个值。为什么?

编辑:我不是要求最好的方式来存储布尔值。我已经从其他答案中了解到 NumPy、BitArray 等。我的问题是为什么,而不是如何。只是为了清楚和专注,我已经删除了问题的第二部分。

python

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

编写更通用的指针代码

假设我想编写一个接收指针的函数.但是我想允许调用者使用裸指针或智能指针 - 无论他们喜欢什么.这应该是好的,因为我的代码应该依赖于指针语义,而不是指针实际实现的方式.这是一种方法:

template<typename MyPtr>
void doSomething(MyPtr p)
{
    //store pointer for later use
    this->var1 = p;

    //do something here
}
Run Code Online (Sandbox Code Playgroud)

上面将使用duck typing并且可以传递裸指针或智能指针.当传递的值是基指针时我们需要查看是否可以转换为派生类型.

template<typename BasePtr, typename DerivedPtr>
void doSomething(BasePtr b)
{
    auto d = dynamic_cast<DerivedPtr>(b);
    if (d) {
        this->var1 = d;

        //do some more things here
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于原始指针,但不适用于智能指针,因为我需要使用dynamic_pointer_cast而不是dynamic_cast.

上面问题的一个解决方案是我添加了一个新的实用工具方法,类似于universal_dynamic_cast通过选择使用的重载版本在原始指针和智能指针上工作std::enable_if.

我的问题是,

  1. 添加所有这些复杂性是否有价值,因此代码支持原始指针和智能指针?或者我们应该shared_ptr在我们的库公共API中使用?我知道这取决于库的目的,但是使用shared_ptr所有API签名的一般感觉是什么?假设我们只需要支持C++ 11.
  2. 为什么STL没有内置指针强制转换,无论你是否传递原始指针或智能指针?这是故意的STL设计师还是只是疏忽?
  3. 上述方法中的另一个问题是智能感知的丢失和可读性的缺失.这显然是所有鸭类型代码中的问题.但是,在C++中,我们有一个选择.我可以很容易地在上面强烈地输入我的论点,就像shared_ptr<MyBase>会牺牲灵活性来让调用者传递包含在任何指针中的任何东西,但是我的代码的读者会更自信,并且可以在应该进入的内容上构建更好的模型.在C++公共库API中,是否有这样或那样的一般偏好/优势?
  4. 我在其他SO回答中看到了另一种方法,作者提出你应该只使用template<typename T>并让调用者决定T是否是某种指针类型或引用或类.如果我必须在T中调用某些东西,这种超级泛型方法显然不起作用,因为C++需要解除引用指针类型,这意味着我必须创建实用程序方法,例如universal_deref使用std::enable_if将*运算符应用于指针类型但不对普通对象执行任何操作.我想知道是否有任何设计模式可以更容易地实现这种超级通用方法.最重要的是,是否值得去解决所有这些问题,或者只是保持简单并 …

c++ smart-pointers c++11

6
推荐指数
1
解决办法
326
查看次数

使用乘法的散列函数的缺点是什么

几乎每本教科书和 CS 课程中都引用了两种实现哈希函数的基本方法:

  1. 除法方法,我们只是简单地k mod m选择 m 作为素数,不太接近 2 的幂。
  2. 乘法方法,我们将 k 与一些精心挑选的无理数(Knuth 建议使用基于黄金比例的数字)相乘,介于 0 到 1 之间,取乘积的小数部分并使用所需的最高有效位数。

大多数教科书和课程都引用了方法 1 的几个缺点,包括它很昂贵并且事情取决于 m。但是,我从未见过任何教科书或课程提到方法 2 的单一缺点。

这使得方法 2 更可取。此外,方法 2 在现代计算机上可以非常有效地消除浮点运算。所以看起来方法 2 是绝对的赢家,没有人应该谈论方法 1。但显然情况并非如此。事实上,我从未见过在任何实际实现中使用方法 2。所以它确实有一些缺点。

问题是它们是什么,为什么尽管方法 1 有缺点,但为什么会更频繁地使用它?

algorithm hash hashtable

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

如何将本征库的矩阵或向量类型转换为字符串?

如何在Eigen库中获取Vector3f或其他类型的文本表示形式。我看到了许多使用.format()并返回WithFormat类的示例。然后可以与cout一起使用。但是,我正在寻找以某些人类可读形式将Vector3f作为std:string获取的方法。确切的格式不太重要,因此,如果Eigen具有任何默认格式,那么效果也很好。

注意:我当然可以使用stringstream代替cout,但是我希望有更直接的方法可以做到这一点。

eigen eigen3

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

将特征类型与 STL 容器和 std::vector 一起使用

看起来将 Eigen 类型与 STL 容器一起使用非常混乱,需要特别注意对齐问题。我的问题是我计划创建具有数十个类的复杂类层次结构,这些类可能包含一个或多个特征类型作为成员变量。从文档看来,只要您在成员变量中包含 Eigen 类型,您的类就会“感染”与 Eigen 类型相同的问题。这意味着我必须格外小心地使用 STL 容器,不仅用于 Eigen 类型,而且还用于我所有的几十个类。

让我担心的更糟糕的部分是,任何在他们的代码中使用我的类的实例的人都会遇到同样的问题,并且需要成为这方面的专家——即使我的类没有在他们的公共接口中公开任何特征类型!

这很令人沮丧。我的问题,

  1. 我上面的理解是否正确(我只需要支持 C++11 和现代编译器)?
  2. 有没有人们使用的任何模式,这样他们就不必在所有地方使用特殊的 Eigen 处理来污染他们的代码?
  3. 我正在考虑在全球范围内禁用整个矢量化。这会以性能为代价解决上述问题吗?是否可以仅针对特定代码有选择地启用?
  4. 如果我忘记处理代码中某处的对齐问题,我是否总是得到编译时错误或问题可能仍然隐藏并且在运行时可能会崩溃?

c++ vectorization eigen c++11 eigen3

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

在Windows命令提示符/ PowerShell中下载大文件

我现在有点没钱了...

尝试1

在Powershell中使用iwr。它可以工作,显示进度,但速度慢10倍,直到文件在内存中才刷新:(。

 powershell -command "& { iwr https://github.com/mitchellspryn/AirsimHighPolySuv/releases/download/V1.0.0/SUV.zip -OutFile SUV.zip }"
Run Code Online (Sandbox Code Playgroud)

尝试2

在Powershell中使用.Net webclient。它有效,但是没有任何进展,您无法通过Ctrl + C :(。终止。

powershell -command "& { (New-Object System.Net.WebClient).DownloadFile('https://github.com/mitchellspryn/AirsimHighPolySuv/releases/download/V1.0.0/SUV.zip', 'SUV.zip') }"
Run Code Online (Sandbox Code Playgroud)

尝试3

在Powershell中使用BITS传输。它可以工作,显示进度并且几乎完美……直到您发现它神秘地在GitHub上不起作用(错误禁止403)!

powershell -command "& { Start-BitsTransfer -Source https://github.com/mitchellspryn/AirsimHighPolySuv/releases/download/V1.0.0/SUV.zip -Destination SUV.zip }"
Run Code Online (Sandbox Code Playgroud)

powershell command-line webclient-download microsoft-bits

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