小编Irb*_*bis的帖子

如何将构造函数参数转发给boost :: optional

我有以下简单的结构:

struct X
{
    X(std::string name, int value): name_(name), value_(value){}

    std::string name_;
    int value_;
};
Run Code Online (Sandbox Code Playgroud)

我想将其与boost可选一起使用而不进行复制。这是一个选择:

boost::optional<X> op;
op.emplace("abc", 5);
Run Code Online (Sandbox Code Playgroud)

是否可以不使用emplace函数?(我的意思是一行表达式)

c++ boost c++11 boost-optional

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

gmock - 如何使用 noexcept 说明符模拟函数

我需要模拟以下功能:

 virtual void fun() noexcept = 0;
Run Code Online (Sandbox Code Playgroud)

可以使用 gmock 吗?

Gmock 有以下宏:#define GMOCK_METHOD0_(tn, constness, ct, Method, ...)但有一条评论:// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!此外,我不知道如何使用该宏(参数 tn 和 ct 是什么意思)?

编辑

以下模拟:

GMOCK_METHOD0_(, noexcept, ,fun, void());
Run Code Online (Sandbox Code Playgroud)

使用 gmock 1.7.0 编译,但是当我使用 gmock 1.8.1 编译它时,出现编译错误:

main.cpp:17: error: expected identifier before ‘noexcept’
 GMOCK_METHOD0_(, noexcept, ,fun, void());
                  ^
gmock-generated-function-mockers.h:153: in definition of macro ‘GMOCK_METHOD0_’
   constness ::testing::internal::Function<__VA_ARGS__>* ) const { \
   ^
main.cpp:17: error: expected ‘,’ or ‘...’ before ‘noexcept’
 GMOCK_METHOD0_(, noexcept, …
Run Code Online (Sandbox Code Playgroud)

c++ googletest gmock

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

多次调用 malloc - 高于预期的内存使用量

当我在 Windows 下运行以下 32 位应用程序(调试模式)时,内存使用量达到 2GB 限制并且当 i 等于42885988时循环中断:

for(int i = 0; i < 104857600; ++i)
{
    uint8_t* ptr = (uint8_t*)malloc(1);

    if (!ptr)
    {
        break;
    }

    *ptr = 0;   
}
Run Code Online (Sandbox Code Playgroud)

104857600 那是 100mb 那么如何解释上述程序的行为?

c memory-management

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

最大 malloc 大小低于预期

这是一个检查最大 malloc 大小的简单程序:

#include <iostream>

std::size_t maxDataSize = 2097152000; //2000mb

void MallocTest(void*& ptr)
{
    while (1)
    {
        ptr = malloc(maxDataSize);

        if (ptr)
        {
            std::cout << "Malloc success: " << maxDataSize << std::endl;
            return;
        }

        maxDataSize -= 1024;

        if (maxDataSize <= 0)
        {
            return;
        }           
    }
}

int main()
{
    void* ptr = nullptr;
    MallocTest(ptr);
    if (ptr)
    {
        free(ptr);
    }
    system("pause");
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我使用 Windows 10 x64 和 Visual Studio 2017。当我运行该程序时,我成功获得了 ~1300mb 的 malloc 调用。该程序使用 32 位架构(发布模式)构建,因此理论上内存限制等于 2GB。有什么会导致内存碎片吗?为什么我不能分配超过 ~1300mb ?

c++ memory-management

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

GL_CURRENT_VERTEX_ATTRIB - 文档说明

OpenGL的4文档说:

GL_CURRENT_VERTEX_ATTRIB

params 返回四个值,代表索引指定的通用顶点属性的当前值。通用顶点属性 0 的唯一性在于它没有当前状态,因此如果 index 为 0 将产生错误。所有其他通用顶点属性的初始值为 (0,0,0,1)。

在实践中“如果索引为 0 将产生错误”是什么意思?

假设我有一个具有以下布局的顶点着色器:

layout (location = 0) in vec3 pos;
Run Code Online (Sandbox Code Playgroud)

我想设置一个通用(常量)顶点属性。我可以使用索引等于 0 的 glVertexAttrib3f 吗?

glVertexAttrib3f(0, 1, 0, 0);
Run Code Online (Sandbox Code Playgroud)

后来我想这样检查当前的顶点属性:

glGetVertexAttribfv(0, GL_CURRENT_VERTEX_ATTRIB, data);
Run Code Online (Sandbox Code Playgroud)

这是正确的吗 ?

opengl

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

单例和新运算符 - 线程安全

我知道 Scott Meyers Singleton 对于 C++11 及更高版本是线程安全的。以下代码是否也是线程安全的(对于 C++11 及更高版本)?

class T
{
    static T* obj;
public:
    T& GetInstance()
    {
        if (!obj)
        {
            obj = new T();
        }
        return *obj;
    }
};
T* T::obj=nullptr;
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

Windows 上的 Git Bash - CMake 错误:源目录不存在

我在 Windows 10 上使用 Git Bash。当我从目录运行以下命令时TestCpp

cmake -S . -B build -G "Visual Studio 15 2017" -A "Win32"
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

CMake Error: The source directory "C:/Projects/TestCpp/build" does not exist.
Run Code Online (Sandbox Code Playgroud)

当我创建构建文件夹然后从该文件夹运行命令时:

cmake -G "Visual Studio 15 2017" -A "Win32" .. 
Run Code Online (Sandbox Code Playgroud)

一切正常。为什么第一个命令不起作用?

cmake

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

矢量的 emplace_back - 矢量作为构造函数参数

我有以下结构:

struct A{};

struct B
{
    B(std::shared_ptr<A> a, int x): a_(a), x_(x){}

    std::shared_ptr<A> a_;
    int x_;
};

struct C
{
    C(std::vector<B> v, bool c){}
};
Run Code Online (Sandbox Code Playgroud)

我想将 C 类型的对象插入到向量中,但以下代码不起作用:

std::vector<C> vecC;
vecC.emplace_back({std::make_shared<A>(), 2}, false);
Run Code Online (Sandbox Code Playgroud)

或者,这种方式对以下内容没有意义emplace_back

vecC.emplace_back(B{std::make_shared<A>(), 2}, false);
Run Code Online (Sandbox Code Playgroud)

我应该如何将 C 类型的对象插入到向量中?

c++ c++17

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

Winapi - 将 LPWCSTR 作为 LPCSTR 传递

我使用扩展为 CreateWindowExA 的 CreateWindowEx。该函数使用 LPCSTR 类型。我想作为第二个参数传递 MSFTEDIT_CLASS(来自 Richedit.h):

#define MSFTEDIT_CLASS L"RICHEDIT50W"
Run Code Online (Sandbox Code Playgroud)

以下铸造不起作用:

(LPCSTR)MSFTEDIT_CLASS
Run Code Online (Sandbox Code Playgroud)

CreateWindowEx 返回 NULL。当我以这种方式传递第二个参数时它起作用:

"RICHEDIT50W"
Run Code Online (Sandbox Code Playgroud)

但我不想从标题中复制字符串。如何解决?

c c++ winapi

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

符号可见性 - 共享库与 dll

我有一个定义全局符号-函数的C++动态库。当我使用 gcc 编译库时,这些符号默认可见。当应用程序链接到几个库时,可能会导致符号冲突。我可以将函数放入命名空间并使用编译标志隐藏私有函数-fvisibility=hidden。那么API函数应该包含以下属性:__attribute__ ((visibility ("default")))

假设我使用 Microsoft Visual Studio 编译器在 Windows 上编译动态库。有些符号没有定义,__declspec(dllexport)是否意味着这些符号将被隐藏?

c++ dll visibility symbols shared-libraries

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