我总是认为std::unique_ptr
与使用原始指针相比没有任何开销.但是,编译以下代码
#include <memory>
void raw_pointer() {
int* p = new int[100];
delete[] p;
}
void smart_pointer() {
auto p = std::make_unique<int[]>(100);
}
Run Code Online (Sandbox Code Playgroud)
with g++ -std=c++14 -O3
生成以下程序集:
raw_pointer():
sub rsp, 8
mov edi, 400
call operator new[](unsigned long)
add rsp, 8
mov rdi, rax
jmp operator delete[](void*)
smart_pointer():
sub rsp, 8
mov edi, 400
call operator new[](unsigned long)
lea rdi, [rax+8]
mov rcx, rax
mov QWORD PTR [rax], 0
mov QWORD PTR [rax+392], 0
mov rdx, rax
xor …
Run Code Online (Sandbox Code Playgroud) 我最近下载了用于Python的Anaconda发行版.我注意到,如果我编写并执行Python脚本(通过双击其图标),我的计算机(在Windows 8上运行)将使用旧版本的Python而不是Anaconda的版本执行它.因此,例如,如果我的脚本包含import matplotlib
,我将收到错误.有没有办法让我的脚本使用Anaconda的Python版本?
我知道我可以在命令提示符下打开Anaconda的Python版本并手动导入它,但是我想设置一些东西,这样我就可以双击.py文件并自动使用Anaconda的Python版本.
我正在尝试编写一个constexpr
表单的函数:
constexpr int foo(bool cond) {
int a, b, c;
if (cond) {
a = 1;
b = 2;
c = 3;
}
else {
a = -1;
b = -2;
c = -3;
}
return a + b + c;
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器抱怨我使用了未初始化的变量,尽管事实上保证了局部变量的最终初始化.
我可以重新编写函数来使用三元运算符,即int a = cond ? 1 : -1;
等等,但我不愿意.有没有办法说服编译器初始化局部变量?
请考虑以下示例:
class X {
public:
X() = default;
X(const X&) = default;
X(X&&) = delete;
};
X foo() {
X result;
return result;
}
int main() {
foo();
}
Run Code Online (Sandbox Code Playgroud)
Clang和GCC对该计划是否有效表示不同意见.GCC尝试在调用期间初始化临时函数时调用move构造函数,该函数foo()
已被删除,从而导致编译错误.Clang处理这个很好,即使有-fno-elide-constructors
.
任何人都可以解释为什么GCC被允许在这种情况下调用移动构造函数?不是result
左值?
以下代码编译时没有警告:
std::uint16_t a = 12;
std::uint16_t b = a & 0x003f;
Run Code Online (Sandbox Code Playgroud)
但是,与按位一起执行位移会导致“隐式转换警告”:
std::uint16_t b = (a & 0x003f) << 10; // Warning generated.
Run Code Online (Sandbox Code Playgroud)
gcc 和 clang 都抱怨有从int
to的隐式转换uint16_t
,但我不明白为什么引入位移会导致右手表达式突然计算为 an int
。
编辑:对于clang,我用-std=c++14 -Weverything
标志编译;对于 gcc,我用-std=c++14 -Wall -Wconversion
标志编译。
对 Spring 的两个实例执行相等性检查时,Kotlin 编译器报告错误TypeDescriptor
。例如,
import org.springframework.core.convert.TypeDescriptor
fun foo(a: TypeDescriptor, b: TypeDescriptor) = a == b
Run Code Online (Sandbox Code Playgroud)
无法编译并显示错误消息No method 'equals(Any?): Boolean' available
。TypeDescriptor
确实覆盖该equals
方法,并将==
运算符替换为a.equals(b)
有效。
我使用的是 Kotlin 版本 1.3.21。
Angular 术语表的“视图层次结构”部分包含以下段落
[A] 视图层次结构并不意味着组件层次结构。嵌入特定层次结构上下文中的视图可以是其他组件的宿主视图。
我不确定这段话想说什么,特别是因为给出的示例听起来非常像组件树。在什么情况下视图层次结构不会隐含组件树?
我正在尝试在 OpenGL 中程序生成一个充满星星的背景。
我采用的方法是创建一个带有立方体贴图纹理的天空盒。立方体贴图纹理的每一面基本上由一个 2048x2048 的黑色图像组成,其中随机选择的纹素设置为白色。结果如下:
我不确定从图像上看它有多明显,但是当在一个非常明显的盒子形状周围移动时,可以看出靠近盒子边缘的星星看起来更小而且更靠近。我怎样才能防止这种情况?我是否需要放弃天空盒方法并使用类似天空球的东西?
编辑:这是我将立方体贴图映射到天空的方式。
// Create and bind texture.
glGenTextures(1, &texture_);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture_);
for (unsigned int i = 0; i < 6; ++i) {
std::vector<std::uint8_t> image = generateTexture(TEXTURE_WIDTH, TEXTURE_HEIGHT);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, TEXTURE_WIDTH, TEXTURE_HEIGHT,
0, GL_RGB, GL_UNSIGNED_BYTE, image.data());
}
// Set texture parameters.
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
Run Code Online (Sandbox Code Playgroud)
下面是generateTexture
函数的定义:
std::vector<std::uint8_t> Stars::generateTexture(GLsizei width, GLsizei height) {
std::vector<std::uint8_t> image(static_cast<std::size_t>(3 * width * height)); …
Run Code Online (Sandbox Code Playgroud) 是否有可能在std::string
不复制的情况下将a 分成两个或更多个子串,就像我们可以使用移动构造函数创建一个新的std::string
而不复制一样?
鉴于执行Python字节码将比运行原始源代码更快,因为Python不必重新编译,为什么Python只导入脚本时保存编译的字节码?为每个执行的脚本保存.pyc文件不是更好吗?