小编aCu*_*ria的帖子

定制内存管理器

我正在尝试实现一个自定义内存管理器,我想知道是否有更好的方法来实现这个函数,因为当我被问及无效指针算术时,有些人认为如果我在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)

c++

8
推荐指数
2
解决办法
1796
查看次数

可能在ReadFile()上有超时?

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()正在等待输入.什么是解决这个问题的最佳方法?

c++ windows

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

为什么有一个本地的仿函数是不好的?

例如,如果谓词只使用一次,那么在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)

c++ visual-studio-2010

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

如何在给定视图空间深度值和ndc xy的情况下恢复视图空间位置

我正在写一个延迟着色器,我正试图更紧密地收拾我的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中存储正确的位置并使用它进行测试.

c++ glsl perspectivecamera coordinate-transformation

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

组织解决方案,项目和SVN

我想在SVN中建立一个关于目录结构的项目.我已经在SO上阅读了几个关于此问题的答案,但由于我是新手,所以大多数都很难理解.

我正在构建一个单独的库,其他几个不同的项目取决于:

我需要能够轻松导出MyLibrary(仅限标题和.lib)供第三方使用

MyLibrary1

  • 取决于外部库,应该能够管理这些库的不同版本!

MyLibrary2

  • 取决于外部图书馆fmod,glew,...

项目1,2,4,5,6 ......

  • 取决于MyLibrary1,2或两者
  • 每个项目都需要多个平台的版本(osx,windows ......)

我想知道一个很好的方法来组织这个,请记住我对这个很陌生 - 一个更迂腐的答案会有所帮助.例如,如果您编写类似/ 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)

c++ svn project-organization visual-c++

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

为什么std :: packaged_task <void()>无效?

使用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(),它的行为不符合预期.

c++ packaged-task c++11

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

abort()和terminate()"live"在哪里?

关于终止处理程序,

据我了解,当代码中发生不好的事情时,例如当我们没有发现异常时,

调用terminate(),然后调用abort()

set_terminate(my_function)允许我们使用terminate()来调用用户指定的函数my_terminate.

我的问题是:这些函数"活"在哪里它们似乎不是语言的一部分,但它们就好像它们存在于每个单独的cpp文件中,而不必包含任何头文件.

c++

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

着色器的标准命名约定

着色器是否有“最佳”命名约定?如果没有,流行的选择是什么?

例如

*.vert *.vertex *.vsh

*.frag *.pixel *.fsh *.psh

我没有几何和镶嵌的例子

shader glsl hlsl

5
推荐指数
2
解决办法
2495
查看次数

OpenGl读写相同的纹理

我有一个RGBA16F纹理,深度为normal.x,normal.y就可以了.我想读取r,g,b并写入纹理上的a.我将完全击中每个像素一次.

如果我在这种情况下读取和写入相同的纹理,是否会出现性能问题?

c++ opengl

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

在什么时候将unique_lock与shared_mutex一起使用?

通常,在使用“普通”互斥锁时,您可以像中那样使用它remove1()。但是,现在有了shared_lockunique_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)

c++ c++17

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