小编Mic*_*ael的帖子

新的和删除在C++ 14中仍然有用吗?

鉴于可用性make_uniquemake_shared自动删除unique_ptr以及shared_ptr析构函数,在C++ 14中使用new和使用的情况(除了支持遗留代码之外)是delete什么?

c++ new-operator dynamic-memory-allocation c++11 c++14

59
推荐指数
2
解决办法
3809
查看次数

从硬件架构的角度来看,为什么非规范化浮点数比其他浮点数慢得多?

与法线相比,已知非正规性表现不佳,大约100倍左右.这经常导致意外的软件问题.

我很好奇,从CPU架构角度来看,为什么非正规数必须是多慢?缺乏表现是否是他们不幸的表现所固有的?或者CPU架构师可能会忽略它们以减少硬件成本(错误的)假设非正规无关紧要?

在前一种情况下,如果非正规本质上是硬件不友好的,那么是否已知非IEEE-754浮点表示在零附近也是无间隙的,但是对于硬件实现更方便?

floating-point cpu-architecture

15
推荐指数
1
解决办法
911
查看次数

为什么*必须*删除[]和删除不同?

我很清楚地知道,在C++中,什么delete[]是对new[],deletenew.这与C++语法无关.我想知道原因 delete[]被定义为与平原不同的东西delete.这有什么实施原因?

考虑一下这段代码会发生什么:

MyClass *object = new MyClass;
delete object;
Run Code Online (Sandbox Code Playgroud)

delete遇到存储器管理器具有查找在其分配结构,不管它是对象指针值,并标记对应sizeof(MyClass)的存储器作为自由块.

现在考虑一下这段代码会发生什么:

MyClass *array = new MyClass[ num_objects ];
delete [] array;
Run Code Online (Sandbox Code Playgroud)

delete遇到存储器管理器具有查找在其分配结构数组指针值,不管它是,发现num_objects从该结构值,并标记对应num_objects*sizeof(MyClass)的存储器作为自由块.

除了num_objects在单个对象案例中假设1并且在数组情况下查找内部数据结构之外,我没有看到差异.那么,为什么deletedelete[]不能一直拼写相同?

换句话说,出了什么问题

MyClass *object = new MyClass;
Run Code Online (Sandbox Code Playgroud)

被实施为

MyClass *object = new MyClass[1];
Run Code Online (Sandbox Code Playgroud)

让C++的语法就不会做出区分deletedelete[]

c++ compiler-construction delete-operator

13
推荐指数
2
解决办法
425
查看次数

根据需要组装功能并快速计算

有解释语言,如Lisp,Tcl,Perl等,可以很容易地在运行时在代码中定义lambda/proc/sub,并在同一个会话中对其进行评估.

存在编译语言,例如C++,其执行速度比解释的语言快得多,但是在运行时期间在编译程序中定义函数并执行它并不容易,如果可能的话.

这里的问题是执行以下操作:

  1. 在运行时定义函数:例如,基于初始输入数据导出数据的分析模型.

  2. 在循环中快速执行上述功能:例如,应用派生的分析模型来分析传入的数据.

我看到的一个解决方案不是很漂亮:

  1. 基于初始输入数据,在嵌入式Tcl中导出表示分析模型的过程.

  2. 通过评估Tcl中的一个样本点阵列的过程创建了一个查找表,从乐观的角度来说,这将覆盖适用范围.

  3. 查找表从Tcl解释器传递回二进制文件(用C++开发).

  4. 然后通过在查找表中"足够接近"值之间进行插值来分析输入数据.

上述解决方案有效,但在概念和计算方面都存在很多问题.因此,问题是:是否可以在C++中定义一个函数并使其可以在同一个运行时会话中执行?

从概念上讲,是否有可能做一些事情,比如将函数创建为字符串,在内存中编译它,并以某种方式将其链接回正在执行的二进制文件中?

c++ lambda linker interpreter artificial-intelligence

9
推荐指数
1
解决办法
135
查看次数

如何在Eigen中使用逗号分隔初始化可能在C++中实现?

这是Eigen文档的一部分:

Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;
std::cout << m;
Run Code Online (Sandbox Code Playgroud)

输出:

1 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)

我无法理解如何通过operator <<上面捕获所有逗号分隔值.我做了一个小小的实验:

cout << "Just commas: ";
cout << 1, 2, 3, 4, 5;
cout << endl;
cout << "Commas in parentheses: ";
cout << ( 1, 2, 3, 4, 5 );
cout << endl;
Run Code Online (Sandbox Code Playgroud)

可以预测(根据我对C++语法的理解)只有一个值被operator <<捕获:

Just commas: 1
Commas in parentheses: 5
Run Code Online (Sandbox Code Playgroud)

因此标题问题.

c++ initialization operator-overloading eigen

9
推荐指数
2
解决办法
1311
查看次数

模板方法,其参数个数为实例化而固定,但可通过模板参数变量

我想使用整数模板参数为模板类定义一个函数,以便函数参数的数量取决于模板参数.这是一个例子:

template< class Coord, int dim >
class Point {
    Coord mCoords[ dim ];
public:
    void Set( /* I want exactly dim Coord arguments here. */ );
};
Run Code Online (Sandbox Code Playgroud)

我想要编译这段代码:

Point<double,2> pt2d;
pt2d.Set( 25, 32 );
Point<double,3> pt3d;
pt3d.Set( 25, 32, 100 );
Run Code Online (Sandbox Code Playgroud)

并且此代码失败:

Point<double,2> pt2d;
pt2d.Set( 25, 32, 100 );  // Too many arguments
Point<double,3> pt3d;
pt3d.Set( 25, 32 );       // Too few arguments
Run Code Online (Sandbox Code Playgroud)

现在,我可以手动专注Point于较小的维度以具有不相关的Set功能,但我发现基本上重复相同的代码un-C++的做法 - ish.此外,我不应该专门针对int模板参数的每个可能值.

有没有可能实现的Point<Coord,dim>::Set()函数可以采用完全dim类型的参数而Coord无需为每个值编写特化代码dim

c++ templates

9
推荐指数
1
解决办法
188
查看次数

从同一个向量的不同范围的多个线程调用std :: copy是否安全?

float从多个线程计算s并将结果存储在非重叠范围内,vector<float>如下所示:

在运行我预先分配它的任何线程之前vector::reserve.

在每个线程中vector,计算特定于线程的结果,然后将其复制到目标容器中,如下所示:

vector<float>::iterator destination = globalVector.begin() + threadSpecificIndex;
std::copy( localVector.begin(), localVector.end(), destination );
Run Code Online (Sandbox Code Playgroud)

这是安全的做法吗?

c++ multithreading stl

9
推荐指数
1
解决办法
648
查看次数

C++/Linux中的系统范围的全局变量/信号量/互斥量?

是否可以在Linux上用C++创建系统范围的全局变量/信号量/互斥量?

原因如下:我有一个系统经常在不相关的数据上运行同一软件的多个副本.通常有4个作业,每个作业运行相同的软件.该软件有一个小部分,它创建一个占用大量内存的巨大图形; 在该部分以外的内存使用量适中.

有时会发生这样的情况,即2个作业同时遇到同样占用大量内存的部分,整个系统开始交换.因此,我们希望通过在不同作业之间创建类似于临界区互斥体的东西来防止这种情况,这样一次就不会有多个内存分配大量内存.

如果这些是相同工作的线程,pthread锁将完成这项工作.

在不同的工作之间实现这种互斥量的好方法是什么?

c++ linux concurrency mutex semaphore

8
推荐指数
3
解决办法
7097
查看次数

为什么C++不允许函数参数用于默认值后面的参数?

这是对这个问题的后续跟进.OP问题中的代码看起来非常合理且对我来说毫不含糊.为什么C++不允许使用以前的参数来定义后面的参数的默认值,如下所示:

int foo( int a, int b = a );
Run Code Online (Sandbox Code Playgroud)

此外,至少在C++ 11中,声明的参数类型可用于确定返回类型,因此以类似的方式使用函数参数并非闻所未闻:

auto bar( int a ) -> decltype( a );
Run Code Online (Sandbox Code Playgroud)

因此,问题是:为什么foo不允许上述声明的原因是什么?

c++ language-lawyer default-parameters

7
推荐指数
1
解决办法
215
查看次数

在`:,`中稍后使用构造函数的`:,`部分中初始化的成员是否安全?

例如,Area()在这里打电话是否安全:

Polygon::Polygon( Coord x0, Coord y0, Coord x1, Coord y1 )
    : m_BoundingBox( x0, y0, x1, y1 ), m_Area( m_BoundingBox.Area() )
{
}
Run Code Online (Sandbox Code Playgroud)

也就是说,可以假设: ,构造函数部分中的成员按照列出的顺序构造和初始化吗?

c++ constructor

7
推荐指数
1
解决办法
216
查看次数