我已经多次阅读了新的 c++20 特性no_unique_address
,我希望有人能用一个比下面这个来自 c++ 参考的例子更好的例子来解释和说明。
说明 适用于在非位域的非静态数据成员的声明中声明的名称。
指示此数据成员不需要具有与其类的所有其他非静态数据成员不同的地址。这意味着如果成员具有空类型(例如无状态分配器),编译器可能会优化它以不占用空间,就像它是一个空基一样。如果该成员不为空,则其中的任何尾部填充也可以重新用于存储其他数据成员。
#include <iostream>
struct Empty {}; // empty class
struct X {
int i;
Empty e;
};
struct Y {
int i;
[[no_unique_address]] Empty e;
};
struct Z {
char c;
[[no_unique_address]] Empty e1, e2;
};
struct W {
char c[2];
[[no_unique_address]] Empty e1, e2;
};
int main()
{
// e1 and e2 cannot share the same address because they have the
// same type, even though they are marked with …
Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
void main(void)
{
int a;
int result;
int sum = 0;
printf("Enter a number: ");
scanf("%d", &a);
for( int i = 1; i <= 4; i++ )
{
result = a ^ i;
sum += result;
}
printf("%d\n", sum);
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么这个'^'不起作用.
在OpenGL初始化期间,程序应该执行以下操作:
<Get Shader Source Code>
<Create Shader>
<Attach Source Code To Shader>
<Compile Shader>
Run Code Online (Sandbox Code Playgroud)
获取源代码可能就像将它放在一个字符串中一样简单:(示例摘自SuperBible,第6版)
static const char * vs_source[] =
{
"#version 420 core \n"
" \n"
"void main(void) \n"
"{ \n"
" gl_Position = vec4(0.0, 0.0, 0.0, 1.0); \n"
"} \n"
};
Run Code Online (Sandbox Code Playgroud)
问题是很难直接在字符串中编辑,调试和维护GLSL着色器.因此,从文件中获取字符串中的源代码更容易开发:
std::ifstream vertexShaderFile("vertex.glsl");
std::ostringstream vertexBuffer;
vertexBuffer << vertexShaderFile.rdbuf();
std::string vertexBufferStr = vertexBuffer.str();
// Warning: safe only until vertexBufferStr is destroyed or modified
const GLchar *vertexSource = vertexBufferStr.c_str();
Run Code Online (Sandbox Code Playgroud)
现在的问题是如何使用您的程序发送着色器?实际上,使用您的应用程序运送源代码可能是个问题.OpenGL支持"预编译的二进制着色器",但Open Wiki声明:
程序二进制格式不打算传输.期望不同的硬件供应商接受相同的二进制格式是不合理的.期望来自同一供应商的不同硬件接受相同的二进制格式是不合理的.[...]
如何使用C++软件实际运送GLSL着色器?
C++只允许将临时对象分配给const引用.它不允许分配临时对象来引用.
例如:
String& a = String("test"); // Error
const String& a = String("test"); // Ok
Run Code Online (Sandbox Code Playgroud)
无论我到哪里谷歌这个结果,我只看到以下答案
有人说,临时对象在声明后消失了.所以你不应该修改它.
如果C++,如此热衷于阻止修改临时对象,它应该阻止读取临时对象吗?如果临时对象消失了,那么从那里读取内容是没有意义的吗?权利可能发生的可能情况也可能涉及阅读.
那为什么它一直阻止写入并允许读取?
请给我一个可靠的c ++代码说明.
请不要通过指出一些替代方案来偏离问题.请给我一个可靠的答案代码,为什么const int&被允许,而int&不允许用于临时对象.
一个说&&在那里..我的问题不同..另一个说,改变不会反映..改变也不会反映即使它也是const int&.例如:双倍; Const int&i = a; 一个++; 不会影响我..
我安装了Visual Studio 14.现在我VsHub
在系统托盘/通知区域中有一个新应用程序.它是什么?我尝试点击并右键点击它,它什么也没做.
此代码来自C++入门 p.446:
return hash<string>() (sd.isbn());
Run Code Online (Sandbox Code Playgroud)
我不理解带有两对括号的返回表达式.本书前面没有类似的语法.
我认为它有很多关于它的信息,但我不知道这是怎么称呼的.我无法理解下两个代码串之间的区别:
Object obj();
Run Code Online (Sandbox Code Playgroud)
和
Object obj = Object();
Run Code Online (Sandbox Code Playgroud)
你能解释一下吗?或至少说如何称呼它.
在Yii2中,我试图构建隐藏的输入
echo $form->field($model, 'hidden1')->hiddenInput()->label(false);
Run Code Online (Sandbox Code Playgroud)
但我也需要它有一些价值选择,我该怎么做?
由于C++ 11引入了基于范围的for循环(基于范围的c ++ 11),在整数范围内表达循环的最佳方法是什么?
代替
for (int i=0; i<n; ++i)
Run Code Online (Sandbox Code Playgroud)
我想写点类似的东西
for (int i : range(0,n))
Run Code Online (Sandbox Code Playgroud)
新标准是否支持这种类型的任何东西?
更新:本文介绍如何在C++ 11中实现范围生成器:C++中的Generator
考虑:
int f () {
static int i = 0;
return i++;
}
struct Test {
int a, b;
Test () : a(f()), b(f()) {}
};
Test t;
Run Code Online (Sandbox Code Playgroud)
我知道a
之前b
由于其声明的顺序而被初始化struct
.
我也知道这两次打电话都没有f
参加g(f(), f())
.
所以我想知道是否保证t.a == 0
和t.b == 1
?
c++ operator-precedence undefined-behavior initialization-order language-lawyer