我有以下简单的结构:
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函数?(我的意思是一行表达式)
我需要模拟以下功能:
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) 当我在 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 那么如何解释上述程序的行为?
这是一个检查最大 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 ?
在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)
这是正确的吗 ?
我知道 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) 我在 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)
一切正常。为什么第一个命令不起作用?
我有以下结构:
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 类型的对象插入到向量中?
我使用扩展为 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++动态库。当我使用 gcc 编译库时,这些符号默认可见。当应用程序链接到几个库时,可能会导致符号冲突。我可以将函数放入命名空间并使用编译标志隐藏私有函数-fvisibility=hidden。那么API函数应该包含以下属性:__attribute__ ((visibility ("default")))
假设我使用 Microsoft Visual Studio 编译器在 Windows 上编译动态库。有些符号没有定义,__declspec(dllexport)是否意味着这些符号将被隐藏?