我知道按定义,内联成员函数应该进入标题.但是如果不能将函数的实现放入标题呢?让我们来看看这种情况:
档案啊
#pragma once
#include "B.h"
class A{
B b;
};
Run Code Online (Sandbox Code Playgroud)
文件Bh
#pragma once
class A; //forward declaration
class B{
inline A getA();
};
Run Code Online (Sandbox Code Playgroud)
由于圆形包括我必须把实施getA成
B.cpp
#include "B.h"
#include "A.h"
inline A B::getA(){
return A();
}
Run Code Online (Sandbox Code Playgroud)
编译器会内联getA吗?如果是这样,哪个内联关键字是重要的(标题中的那个或.cpp文件中的那个)?是否有另一种方法将内联成员函数的定义放入其.cpp文件中?
什么是执行按位操作的最佳方法vector<bool>?
据我所知,vector<bool>是一个每布尔使用一位的特化.我选择vector<bool>了节省内存的原因.我知道存在一些问题vector<bool>但是对于我的需要它是合适的.
现在 - 对整个这样的向量进行逐位运算的最高效方法是什么?
如果我在for循环中读取并读出每个bool并将其存储回来,我理解它的方式是在内部执行更多操作以访问实际值.
谢谢!
SomeObj<unsigned int>* Buffer;
char* BufferPtr = MemoryManager::giveMeSomeBytes(resX*resY*sizeof(SomeObj<unsigned int>));
Buffer = new(BufferPtr) SomeObj<unsigned int>[resX*resY];
Run Code Online (Sandbox Code Playgroud)
当我用调试器跳过这些行时,它会显示变量Buffer和BufferPtr的值:
BufferPtr: 0x0d7f004c
Buffer: 0x0d7f0050
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么这些价值观会有所不同.我理解它的方式,placement new应该使用从地址'BufferPtr'开始的内存来使用分配的内存上的默认构造函数初始化数组元素,并返回指向数组中第一个元素的第一个字节的指针,该指针应该是传递给placement new运算符的字节完全相同.
我是否理解错误或有人能告诉我为什么价值观不同?
谢谢!
//编辑:好的 - 我进一步调查了这个问题并得到了更令人困惑的结果:
int size = sizeof(matth_ptr<int>);
char* testPtr1 = (char*)malloc(a_resX*a_resY*sizeof(int));
int* test1 = new(testPtr1) int[a_resX*a_resY];
char* testPtr2 = mmgr::requestMemory(a_resX*a_resY*sizeof(int));
int* test2 = new(testPtr2) int[a_resX*a_resY];
char* testPtr3 = (char*)malloc(a_resX*a_resY*sizeof(matth_ptr<int>));
matth_ptr<int>* test3 = new(testPtr3)matth_ptr<int>[a_resX*a_resY];
char* testPtr4 = mmgr::requestMemory(a_resX*a_resY*sizeof(matth_ptr<int>));
matth_ptr<int>* test4 = new(testPtr4)matth_ptr<int>[a_resX*a_resY];
Run Code Online (Sandbox Code Playgroud)
调试器为我的变量返回以下值:
size: 4
testPtr1:0x05100418
test1: 0x05100418
testPtr2:0x0da80050
test2: 0x0da80050
testPtr3:0x05101458
test3: 0x0510145c
testPtr4:0x0da81050
test4: 0x0da81054
Run Code Online (Sandbox Code Playgroud)
所以它显然必须与我的通用smartpointer类matth_ptr有关,所以这里是: …
我有一个现有的Visual Studio C++项目.它使用GLUT创建一个主窗口,并使用glut作为右键单击上下文菜单.
我现在要做的就是打开第二个窗口,用作属性检查器来显示和更改某些值.
每个人都建议使用Qt进行GUI开发,但我发现的所有教程都讨论了在Qt创建者中工作或如何从头开始创建Qt项目.
几年前我使用Qt来做类似的事情,将它添加到我的项目中并不是那么困难.
任何人都可以解释,或指向我的教程解释如何做到这一点?
谢谢!
我在Visual Studio 2008中工作,在项目设置中,我看到"激活扩展指令集"的选项,我可以将其设置为None,SSE或SSE2
那么编译器会尝试将指令一起批处理以便使用SIMD指令吗?
是否有任何规则可以遵循如何优化代码,以便编译器可以使用这些扩展使高效的汇编程序?
例如,目前我正在研究光线跟踪器.着色器接受一些输入并从输入计算输出颜色,如下所示:
PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y);
Color col = shadePixel(data);
Run Code Online (Sandbox Code Playgroud)
例如,编写着色器代码是否有利于它会在一个指令调用中遮蔽4个不同的像素?这样的事情:
PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y);
...
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out);
Run Code Online (Sandbox Code Playgroud)
一次处理多个数据单元.这有利于使编译器使用SSE指令吗?
谢谢!
我正在编写一个应该尽可能实时处理大量数据(1-10 GB之间)的应用程序.
数据存在于硬盘上的多个二进制数据文件中,每个文件在几kb到128MB之间.当进程开始时,首先确定实际需要哪些数据.然后通过用户界面获取一些用户设置,然后通过块处理数据块,其中总是将文件加载到存储器中,处理,然后从存储器中清除.此处理应该很快,因为用户可以更改某些设置,然后重新处理相同的数据,并且此用户交互应尽可能流畅.
现在从磁盘加载是一个相当大的瓶颈,我想在已确定将使用哪些文件的阶段预先加载数据.但是 - 如果我预加载太多数据,操作系统将使用虚拟内存,我将有大量的页面故障,使处理速度更慢.
如何确定要预加载多少数据以保持页面故障低?我可以以某种方式影响我想要保留在内存中的数据吗?
谢谢!
//编辑:我目前正在Windows 7 64上运行(但应用程序是32位)并且应用程序不需要在任何计算机上运行 - 仅在特定计算机上运行,因为这是一个研究项目.
我有一个在调试版本中运行良好的应用程序,但是当我在发布版本中启动它时,我得到了一个
unhandled Exception at 0x0043b134 in myapp.exe: 0xC0000005:
Access violation while reading at position 0x004bd96c
Run Code Online (Sandbox Code Playgroud)
如果我点击"break",它会告诉我没有加载符号,并且无法显示源代码.
在这种情况下我能做些什么来追查问题?
我想做这样的事情(我知道这不会编译):
struct Container{
vector<int> storage;
};
float foo(Container* aContainer){
if(aContainer!=NULL)
vector<int>& workingStorage=aContainer->storage;
else
vector<int> workingStorage;
workingStorage.reserve(1000000);
....use workingStorage to calculate something......
return calculated_result;
}
Run Code Online (Sandbox Code Playgroud)
所以 - 如果我将一个Container传递给函数,我希望函数使用容器中的向量来代替局部变量.如果没有提供容器,则应使用局部变量.
当然我可以在函数的最后将局部变量复制到Container的存储中,但这不是我想要做的.
谢谢!
我习惯写这样的模板:
template<typename T>
void someFunction(SomeClass<T> argument);
Run Code Online (Sandbox Code Playgroud)
但是 - 现在我在另一个写成这样的线程中遇到了模板:
template<U>
void someFunction(SomeClass<U> argument);
Run Code Online (Sandbox Code Playgroud)
据我所知,可以互换地使用"typename"和"class"(除了有关嵌套类型的一些细节......).但如果我不在括号中放一个关键字,这意味着什么呢?
谢谢!
有问题的线程: 为智能指针编写复制构造函数的问题
假设我想要一个指向std :: vector的指针的成员变量,但我不想指定它存储什么类型的变量。我只想访问独立于其实际泛型类型的那些函数。C ++有可能吗?像这样的东西:
class Foo{
public:
void setVec(std::vector* someVec){
myVec = someVec;
};
int getSize(){
return myVec.size();
};
private:
std::vector* myVec;
};
int main(){
Foo foo;
vector<int> vec1;
vector<float> vec2;
foo.setVec(&vec1);
cout<<foo.getSize();
foo.setVec(&vec2);
cout<<foo.getSize();
}
Run Code Online (Sandbox Code Playgroud)
注意:我不想为Foo建立模板,我只想使用Foo的单个实例以及不同类型的向量。
当然-如果我可以更改类向量,则可以创建未模板化的基类
class Ivector{
virtual int size()=0;
};
Run Code Online (Sandbox Code Playgroud)
然后使
class vector<T> : public IVector...
Run Code Online (Sandbox Code Playgroud)
从Ivector继承。但是,如果我无法更改相关类并且模板化类没有这样的未模板化基类,该怎么办?
谢谢!
通常,如果我的#include链变为循环,我通过用前向声明替换#includes中的一个来解决它,然后将依赖于此类型的所有函数实现移动到cpp文件中,其中我改为#include头.
但是 - 在某些情况下,将函数实现放入cpp文件是很糟糕的 - 特别是在处理模板或内联函数时.
因此 - 是否有其他方法来处理循环#include链而不是使用前向声明?
谢谢!
是否有可能有一个模板化的类,并使用其他类型模板构造函数?
这样的事情:
template<typename T1>
class Foo{
template<typename T2>
Foo(T1 aBar, T2 dummyArgument){
bar = aBar;
bytesOfT2 = sizeof(T2);
};
int bytesOfT2;
T1 bar;
};
Run Code Online (Sandbox Code Playgroud)
这可能吗?如果是这样,我怎么称呼这样的构造函数?我是否需要考虑标题和cpp文件?
谢谢!
//编辑:我的特定例子实际上甚至有点复杂.我有
template <typename U1, U2>
class Foo{
U1 var1;
U2 var2;
};
template <typename T1>
class Bar{
template<typename T2, typename T3>
Bar(Foo<T2,T3> aFoo, T1 aVal){
val=aVal;
bytesOfT2=sizeof(T2);
bytesOfT3=sizeOf(T3);
};
int bytesOfT2;
int bytesOfT3;
T1 val;
};
Run Code Online (Sandbox Code Playgroud)
这是否意味着我可以在这里使用任何类型的Foo变量调用构造函数,它应该根据特定版本的Foo自动选择正确的构造函数(例如,如果我传递的变量是Foo类型,它应该自动将T2设置为bool和T3浮动)?