小编Pau*_*eny的帖子

什么时候C++需要#include <new>库?

根据运营商新的参考条目(http://www.cplusplus.com/reference/std/new/operator%20new/):

全局动态存储操作员功能在标准库中是特殊的:

  • operator new的所有三个版本都在全局命名空间中声明,而不是在std命名空间中声明.
  • 第一个和第二个版本在C++程序的每个翻译单元中隐式声明:不需要包含标题以使它们存在.

在我看来,这意味着在C++程序的每个翻译单元中都没有隐式声明第三版operator new(placement new),<new>并且需要包含标题才能使它存在.那是对的吗?

如果是这样,如何使用g ++和MS VC++ Express编译器,我似乎可以#include <new>在我的源代码中使用第三版new编译代码?

另外,关于operator new的MSDN标准C++库参考条目为包含该#include <new>语句的三种形式的operator new提供了一些示例代码,但是如果没有这个包含,该示例似乎对我来说编译和运行相同?

// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;

class MyClass 
{
public: 
   MyClass( )
   {
      cout << "Construction MyClass." << this << endl;
   };

   ~MyClass( )
   {
      imember = 0; cout << "Destructing MyClass." << this << endl;
   };
   int imember;
};

int main( ) 
{
   // The first form of new …
Run Code Online (Sandbox Code Playgroud)

c++ include standard-library new-operator

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

为什么GoF建议在C++模板方法模式实现中使用受保护(而不是私有)的虚拟方法?

来自模板方法模式的四人帮:

三个实施问题值得注意:

  1. 使用C++访问控制.在C++中,模板方法调用的基本操作可以声明为受保护的成员.这确保了它们仅由模板方法调用.必须重写的原始操作被声明为纯虚拟.模板方法本身不应该被覆盖; 因此,您可以使模板方法成为非虚拟成员函数.

"这确保了它们只能通过模板方法调用." 不是真的,不是吗?也可以从派生类调用原始方法(如果某些是虚拟的而不是纯虚拟的).仅仅声明原始方法private是否真的确保它们仅由模板方法调用?然后,仍然可以在子类中实现(或重新实现)私有虚拟基元方法,以提供在超类中的模板方法中定义的算法中所需的专门行为.

请参阅Herb Sutter的"虚拟性":

http://www.gotw.ca/publications/mill18.htm

在哪里他说:

准则#2:更喜欢将虚拟功能设为私有.准则#3:只有派生类需要调用虚函数的基本实现时,才能使虚函数受到保护.

我没有在GoF模板方法模式中看到派生类调用虚函数的基类实现的任何要求,那么Gang of Four为什么建议使这些函数受保护而不是私有?

c++ virtual design-patterns template-method-pattern

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

在结构化的排序向量中的struct元素上的std :: sort和std :: lower_bound/equal_range的C++ lambdas

我有一个这个结构的std :: vector:

struct MS
{        
  double aT;
  double bT;
  double cT;
};
Run Code Online (Sandbox Code Playgroud)

我想使用std :: sort以及std :: lower_bound/equal_range等...

我需要能够对它进行排序并在结构的前两个元素中查找它.所以此刻我有这个:

class MSaTLess 
{
public:
  bool operator() (const MS &lhs, const MS &rhs) const
  {
    return TLess(lhs.aT, rhs.aT);
  }
  bool operator() (const MS &lhs, const double d) const
  {
    return TLess(lhs.aT, d);
  }
  bool operator() (const double d, const MS &rhs) const
  {
    return TLess(d, rhs.aT);
  }
private:
  bool TLess(const double& d1, const double& d2) const
  {
    return d1 < d2;
  } …
Run Code Online (Sandbox Code Playgroud)

sorting search lambda stl c++11

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

仅在GPU上求解小对称正定Ax = b

我正在尝试在实时3D建模中优化应用程序.应用程序的计算部分几乎完全在CUDA中的GPU上运行.该应用需要小(6x6)双精度对称正定线性系统的解决方案Ax = b每秒500+次.目前,这是正在使用基于乔莱斯基线性代数库的高效CPU完成,但必要数据从CPU复制 - GPU和回GPU每秒数百和内核的开销次,每次启动等.

如何在GPU上计算线性系统的解决方案,而无需将数据全部输入CPU?我已经阅读了一些关于MAGMA库的内容,但它似乎使用混合算法而不是仅GPU算法.

我已经准备好了,GPU上的单个线性系统的解决方案将比现有的基于CPU的库慢得多,但我想看看是否可以通过删除之间的数据通信来弥补这一点.主机和设备以及内核启动的开销等每秒数百次.如果没有GPU只有类似LAPACK的替代方案,我将如何在GPU上实现一些解决这个特定的6x6案例?如果没有GPU BLAS库的大量时间投资,可以做到吗?

algorithm cuda gpu linear-algebra solver

8
推荐指数
1
解决办法
1624
查看次数

在哪里定义C++类成员模板函数和实例化它的仿函数?

我有一个类Foo,用于一个小型独立项目.它在Foo.h中有一个类定义,在实现文件Foo.cpp中实现了类的成员函数.

第一个问题 - 类Foo的成员函数之一是模板方法Foo :: doSomething(),这个方法的实现应该与Foo.h中的函数声明一起出现是否正确?

Foo :: doSomething()将被实例化的模板参数是两种Functor类型之一 - 类CalcA和CalcB.

我是不是该:

  • (A)将两个Functor类的定义和实现全部放在Foo.cpp中(实际上它们被其他Foo成员函数的实现用来调用Foo :: doSomething).
  • (B)将两个Functor类的定义和实现放在Foo.h中.
  • (C)我应该将Foo.h和Foo.cpp中两个函数的定义和实现分开,就像普通类一样吗?

c++ templates functor

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

CUDA的行列式计算

是否有任何库或免费提供的代码可以完全在GPU上计算6x6),双精度矩阵的行列式?

cuda gpu gpgpu nvidia linear-algebra

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

C++迭代器解除引用和前缀增量/减量样式?是* - 明智的风格吗?

在使用C++迭代器进行编码时,如果你想获得迭代器指向的前一个值,你会写:

*--Iter
Run Code Online (Sandbox Code Playgroud)

或者你认为最好添加括号如下:

*(--Iter)
Run Code Online (Sandbox Code Playgroud)

c++ iterator coding-style prefix decrement

2
推荐指数
1
解决办法
1487
查看次数

struct编译错误中的struct

我正在尝试编写一个包装MPI的框架库.

我有一个框架调用的头文件afw.h和一个名为的框架的实现文件afw.c.

我希望能够通过#include "afw.h"在应用程序代码中编写使用框架的应用程序代码.

摘录自afw.h:

#ifndef AFW_H
#define AFW_H

#include <mpi.h>

struct ReqStruct
{
    MPI_Request req;
};

ReqStruct RecvAsynch(float *recvbuf, FILE *fp);
int RecvTest(ReqStruct areq);
Run Code Online (Sandbox Code Playgroud)

我提供一个实现了RecvAsynchafw.c其中#includes afw.h

当我使用mpicc(在这种情况下使用pgc下面的MPI编译器包装器)编译时:

mpicc -c afw.c -o afw.o
Run Code Online (Sandbox Code Playgroud)

我明白了:

PGC-S-0040-Illegal use of symbol, ReqStruct (./afw.h: 69)
PGC-W-0156-Type not specified, 'int' assumed (./afw.h: 69)
PGC-S-0040-Illegal use of symbol, ReqStruct (./afw.h: 71)
PGC-W-0156-Type not specified, 'int' assumed (./afw.h: 71)
Run Code Online (Sandbox Code Playgroud)

以及任何地方ReqStruct使用的类似错误 …

c compiler-construction mpi header-files

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