根据运营商新的参考条目(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++访问控制.在C++中,模板方法调用的基本操作可以声明为受保护的成员.这确保了它们仅由模板方法调用.必须重写的原始操作被声明为纯虚拟.模板方法本身不应该被覆盖; 因此,您可以使模板方法成为非虚拟成员函数.
"这确保了它们只能通过模板方法调用." 不是真的,不是吗?也可以从派生类调用原始方法(如果某些是虚拟的而不是纯虚拟的).仅仅声明原始方法private是否真的确保它们仅由模板方法调用?然后,仍然可以在子类中实现(或重新实现)私有虚拟基元方法,以提供在超类中的模板方法中定义的算法中所需的专门行为.
请参阅Herb Sutter的"虚拟性":
http://www.gotw.ca/publications/mill18.htm
在哪里他说:
准则#2:更喜欢将虚拟功能设为私有.准则#3:只有派生类需要调用虚函数的基本实现时,才能使虚函数受到保护.
我没有在GoF模板方法模式中看到派生类调用虚函数的基类实现的任何要求,那么Gang of Four为什么建议使这些函数受保护而不是私有?
我有一个这个结构的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) 我正在尝试在实时3D建模中优化应用程序.应用程序的计算部分几乎完全在CUDA中的GPU上运行.该应用需要小(6x6)双精度对称正定线性系统的解决方案Ax = b每秒500+次.目前,这是正在使用基于乔莱斯基线性代数库的高效CPU完成,但必要数据从CPU复制 - GPU和回GPU每秒数百和内核的开销次,每次启动等.
如何在GPU上计算线性系统的解决方案,而无需将数据全部输入CPU?我已经阅读了一些关于MAGMA库的内容,但它似乎使用混合算法而不是仅GPU算法.
我已经准备好了,GPU上的单个线性系统的解决方案将比现有的基于CPU的库慢得多,但我想看看是否可以通过删除之间的数据通信来弥补这一点.主机和设备以及内核启动的开销等每秒数百次.如果没有GPU只有类似LAPACK的替代方案,我将如何在GPU上实现一些解决这个特定的6x6案例?如果没有GPU BLAS库的大量时间投资,可以做到吗?
我有一个类Foo,用于一个小型独立项目.它在Foo.h中有一个类定义,在实现文件Foo.cpp中实现了类的成员函数.
第一个问题 - 类Foo的成员函数之一是模板方法Foo :: doSomething(),这个方法的实现应该与Foo.h中的函数声明一起出现是否正确?
Foo :: doSomething()将被实例化的模板参数是两种Functor类型之一 - 类CalcA和CalcB.
我是不是该:
是否有任何库或免费提供的代码可以完全在GPU上计算小(6x6),双精度矩阵的行列式?
在使用C++迭代器进行编码时,如果你想获得迭代器指向的前一个值,你会写:
*--Iter
Run Code Online (Sandbox Code Playgroud)
或者你认为最好添加括号如下:
*(--Iter)
Run Code Online (Sandbox Code Playgroud)
?
我正在尝试编写一个包装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)
我提供一个实现了RecvAsynch在afw.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使用的类似错误 …