小编Ale*_*wer的帖子

为什么unique_ptr实例化编译为比原始指针更大的二进制?

我总是认为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)

c++ assembly smart-pointers

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

如何使用Anaconda的Python版本执行Python脚本?

我最近下载了用于Python的Anaconda发行版.我注意到,如果我编写并执行Python脚本(通过双击其图标),我的计算机(在Windows 8上运行)将使用旧版本的Python而不是Anaconda的版本执行它.因此,例如,如果我的脚本包含import matplotlib,我将收到错误.有没有办法让我的脚本使用Anaconda的Python版本?

我知道我可以在命令提示符下打开Anaconda的Python版本并手动导入它,但是我想设置一些东西,这样我就可以双击.py文件并自动使用Anaconda的Python版本.

python python-3.x anaconda

27
推荐指数
5
解决办法
14万
查看次数

constexpr函数,具有局部变量的延迟初始化

我正在尝试编写一个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;等等,但我不愿意.有没有办法说服编译器初始化局部变量?

c++ constexpr

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

构造函数调用return语句

请考虑以下示例:

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左值?

c++ language-lawyer c++17

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

位移导致奇怪的类型转换

以下代码编译时没有警告:

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 都抱怨有从intto的隐式转换uint16_t,但我不明白为什么引入位移会导致右手表达式突然计算为 an int

编辑:对于clang,我用-std=c++14 -Weverything标志编译;对于 gcc,我用-std=c++14 -Wall -Wconversion标志编译。

c++ bit-shift type-conversion

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

Kotlin 编译器报告 Spring 的 TypeDescriptor“没有方法 'equals(Any?): Boolean available”

对 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' availableTypeDescriptor确实覆盖该equals方法,并将==运算符替换为a.equals(b)有效。

我使用的是 Kotlin 版本 1.3.21。

kotlin

6
推荐指数
0
解决办法
422
查看次数

Angular 中的组件树与视图层次结构

Angular 术语表的“视图层次结构”部分包含以下段落

[A] 视图层次结构并不意味着组件层次结构。嵌入特定层次结构上下文中的视图可以是其他组件的宿主视图。

我不确定这段话想说什么,特别是因为给出的示例听起来非常像组件树。在什么情况下视图层次结构不会隐含组件树?

angular

5
推荐指数
0
解决办法
721
查看次数

用天空盒程序生成星星

我正在尝试在 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)

c++ opengl procedural-generation

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

划分std :: string而不复制

是否有可能在std::string不复制的情况下将a 分成两个或更多个子串,就像我们可以使用移动构造函数创建一个新的std::string而不复制一样?

c++ string

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

为什么Python只导入脚本的字节码?

鉴于执行Python字节码将比运行原始源代码更快,因为Python不必重新编译,为什么Python只导入脚本时保存编译的字节码?为每个执行的脚本保存.pyc文件不是更好吗?

python bytecode

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