我正在尝试实现一个自定义内存管理器,我想知道是否有更好的方法来实现这个函数,因为当我被问及无效指针算术时,有些人认为如果我在C++中有一个void*,那就非常错误.
// allocates a page of memory.
void ObjectAllocator::allocatePage()
{
//if(OAStats_.PagesInUse_ >= Config_.MaxPages_)
//throw exception
void* buffer = ::operator new(OAStats_.PageSize_); // allocate memory, no constructor call.
// =============== Setup the PageList_ ===============
GenericObject* pNewNode = ::new(buffer) GenericObject(); // Construct GenericObject for the pagelist.
pNewNode->Next = PageList_->Next; // pNewNode points to wherever PageList_ pointed to.
PageList_->Next = pNewNode; // PageList_ points to pNewNode
pNewNode = NULL; // dont need this handle anymore
buffer = static_cast<char*>(buffer) + sizeof(GenericObject); // move pointer to …Run Code Online (Sandbox Code Playgroud) while(GetExitCodeProcess(processInfo.hProcess, &exitCode)
&& exitCode == STILL_ACTIVE)
{
ReadFile(defaultSTDIN, chBuf, 1, &dwRead, 0);
WriteFile(writingEnd, chBuf, 1, &dwWritten, 0);
}
Run Code Online (Sandbox Code Playgroud)
上面代码的问题是,即使通过processInfo.hProcess引用的子进程已经退出,我们仍然停留在while循环中,因为ReadFile()正在等待输入.什么是解决这个问题的最佳方法?
例如,如果谓词只使用一次,那么在main函数中声明类倍增器有什么问题?
#include <list>
#include <algorithm>
#define SIZE 10
int main()
{
std::list<int> myList;
for(int i=0; i<SIZE ;++i)
{
myList.push_back(i);
}
class doubler
{
public:
doubler(){}
int operator()(int a)
{
return a + a;
}
} pred;
std::for_each(myList.begin(), myList.end(), pred);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在写一个延迟着色器,我正试图更紧密地收拾我的gbuffer.但是,我似乎无法正确计算视图空间深度的视图位置
// depth -> (gl_ModelViewMatrix * vec4(pos.xyz, 1)).z; where pos is the model space position
// fov -> field of view in radians (0.62831855, 0.47123888)
// p -> ndc position, x, y [-1, 1]
vec3 getPosition(float depth, vec2 fov, vec2 p)
{
vec3 pos;
pos.x = -depth * tan( HALF_PI - fov.x/2.0 ) * (p.x);
pos.y = -depth * tan( HALF_PI - fov.y/2.0 ) * (p.y);
pos.z = depth;
return pos;
}
Run Code Online (Sandbox Code Playgroud)
计算出的位置是错误的.我知道这是因为我仍然在gbuffer中存储正确的位置并使用它进行测试.
我想在SVN中建立一个关于目录结构的项目.我已经在SO上阅读了几个关于此问题的答案,但由于我是新手,所以大多数都很难理解.
我正在构建一个单独的库,其他几个不同的项目取决于:
我需要能够轻松导出MyLibrary(仅限标题和.lib)供第三方使用
MyLibrary1
MyLibrary2
项目1,2,4,5,6 ......
我想知道一个很好的方法来组织这个,请记住我对这个很陌生 - 一个更迂腐的答案会有所帮助.例如,如果您编写类似/ src的内容,请解释应该进入的内容!我可以猜到,但我不确定=)
////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////
//编辑
我不能把它写成评论,所以这里说:@JN,感谢广泛的回复,我想澄清一些内容,我希望我理解你的意思:
root
library foo
/branches // old versions of foo
/tags // releases of foo
/trunk // current version
/build // stuff required by makefiles
/tools // scripts to launch tests ect
/data // test data needed when running
/output // binaries, .exe files
/dependencies // libraries that foo needs
/lib name
include
lib
/docs // documentation
/releases // generated …Run Code Online (Sandbox Code Playgroud) 使用MSVC2012,
以下代码将按预期编译和运行
std::packaged_task< int() > task( []()->int{ std::cout << "hello world" << std::endl; return 0; } );
std::thread t( std::move(task) );
t.join();
Run Code Online (Sandbox Code Playgroud)
而以下代码将无法编译和运行
std::packaged_task< void() > task( [](){ std::cout << "hello world" << std::endl; } );
std::thread t( std::move(task) );
t.join();
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
编辑:作为一种解决方法,可以使用std :: promise在返回void的函数上获取std :: future
std::promise<void> promise;
auto future = promise.get_future();
std::thread thread( [](std::promise<void> &p){ std::cout << "hello world" << std::endl; p.set_value(); }, std::move(promise) );
future.wait();
Run Code Online (Sandbox Code Playgroud)
请注意,带有std :: thread的vs2012库中存在一个错误,它会强制您将promise作为l值引用传递并移动promise,如果按值传递promise或r-则不会编译价值参考.这应该是因为实现使用std :: bind(),它的行为不符合预期.
关于终止处理程序,
据我了解,当代码中发生不好的事情时,例如当我们没有发现异常时,
调用terminate(),然后调用abort()
set_terminate(my_function)允许我们使用terminate()来调用用户指定的函数my_terminate.
我的问题是:这些函数"活"在哪里它们似乎不是语言的一部分,但它们就好像它们存在于每个单独的cpp文件中,而不必包含任何头文件.
着色器是否有“最佳”命名约定?如果没有,流行的选择是什么?
例如
*.vert *.vertex *.vsh
*.frag *.pixel *.fsh *.psh
我没有几何和镶嵌的例子
我有一个RGBA16F纹理,深度为normal.x,normal.y就可以了.我想读取r,g,b并写入纹理上的a.我将完全击中每个像素一次.
如果我在这种情况下读取和写入相同的纹理,是否会出现性能问题?
通常,在使用“普通”互斥锁时,您可以像中那样使用它remove1()。但是,现在有了shared_lock和unique_lock,您是否应该首先使用共享锁而仅在必要时使用唯一锁?请注意,当模型不存在时remove()可能不需要unique_lock。
void remove1(int id) {
std::unique_lock<std::shared_mutex> lock(mutex_);
for (auto it = models_.begin(); it != models_.end(); ++it)
if ((*it)->getId() == id)
{
it = models_.erase(it);
return;
{
}
void remove2(int id) {
std::shared_lock<std::shared_mutex> sharedLock(mutex_);
for (auto it = models_.begin(); it != models_.end(); ++it)
if ((*it)->getId() == id)
{
sharedLock.unlock();
std::unique_lock<std::shared_mutex> uniqueLock(mutex_);
models_.erase(it);
return;
}
}
Run Code Online (Sandbox Code Playgroud)