小编ein*_*ica的帖子

如何检查字符常量是否符合ASCII?

对早期版本的评论这个回答我的提醒我的事实,我不能想当然地认为'A','B','C'等有连续的数值.我有点假设C或C++语言标准保证这是这种情况.

那么,我该如何确定连续字母字符的值本身是否连续?或者更确切地说,我如何确定单引号内可以表达的字符常量是否具有数字值的ASCII代码?

我问的是如何在C和C++中做到这一点.显然C语言也适用于C++,但是如果有一个C++ ish工具来做这个我也对它感兴趣.另外,我问的是最新的相关标准(C11,C++ 17).

c c++ ascii ebcdic language-lawyer

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

如何在CMakeLists.txt中判断它是否与add_subdirectory()一起使用?

我有此代码项目可以独立构建,也可以作为较大存储库的子项目构建(将其作为子存储库检查)。在后一种情况下,我CMakeLists.txt在主项目中拥有一个顶层

add_subdirectory(${MY_SUBPROJ_SUBDIR})
Run Code Online (Sandbox Code Playgroud)

现在,我希望子项目在通过中使用时,其行为有所不同the add_directory()。显然,我会使用一条大if指令。但是我要检查什么情况?当运行某些命令时CMakeLists.txt,CMake如何“告诉” 它是子目录文件还是主文件?

build cmake subdirectory subrepos

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

什么是#cmakedefine预处理程序指令?

我正在查看ZeroMQ的源代码,我想从源代码构建它.在里面我找到了platform.hpp.in,里面包含:

...
#cmakedefine ZMQ_HAVE_SO_PEERCRED
#cmakedefine ZMQ_HAVE_LOCAL_PEERCRED

#cmakedefine ZMQ_HAVE_SOCK_CLOEXEC
#cmakedefine ZMQ_HAVE_SO_KEEPALIVE
#cmakedefine ZMQ_HAVE_TCP_KEEPCNT
...
Run Code Online (Sandbox Code Playgroud)

我假设这些cmakedefine宏用作生成头文件的模板,但它们在CMake中究竟是如何工作的?如何确定哪些是有效值?在构建项目时,用户如何设置值?

cmake c-preprocessor

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

使用constexpr initializer_list构造函数时,MSVC无法编译

为什么Microsoft Visual C++在编译以下代码时失败?:

template <typename T>
struct slice
{
    size_t length;
    T *ptr;

    constexpr slice(std::initializer_list<T> list)
        : length(list.size()), ptr(list.begin()) {}
};

static_assert(slice<const int>({ 1, 2, 3 }).length == 3, "!!");
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

1>test.cpp(12): error C2131: expression did not evaluate to a constant
1>         visual studio 14.0\vc\include\initializer_list(50): note: failure was caused by an undefined arithmetic operation
Run Code Online (Sandbox Code Playgroud)

initializer_list所有方法的实现都标记了constexpr,看起来它对我来说应该没问题......也许它只是一个编译器问题?

c++ initializer-list visual-c++ constexpr c++11

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

为什么访问器函数必须是const?漏洞在哪里?

当我在学校时,教授们把它敲进了我的脑海,同事们在代码审查中跳了起来,而且几乎所有的C++教科书都在那里:"访问者"(又名"选择器"或"getter")方法必须被标记const.如果它没有改变或改变数据,则标记它const.

为什么?如何调用访问者来修改私有数据?

在下面的示例中,我设置了一个简单的类和一个访问器.如何getBrand()用于修改私有数据?在我眼里,它不能; 那么我们为什么需要标记呢const

换句话说,我是否正确地说getBrand()在实践中不可能改变私有财产?

例:

#include <iostream>
#include <string>

class Cheese {
public:
    Cheese(std::string brand):brand_(brand) {}
    std::string getBrand() { return brand_; } // Intentionally not marked const
private:
    std::string brand_;
};

int main() {
    Cheese cheddar("Cabot clothbound");
    std::cout << "Brand: " << cheddar.getBrand() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ oop getter encapsulation const

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

CUDA常量记忆的生命周期是多少?

我无法绕过对CUDA恒定内存的限制.

  1. 为什么我们不能__constant__在运行时分配内存?为什么我需要在具有接近全局范围的固定大小变量中进行编译?
  2. 什么是常量内存实际加载或卸载?我明白cudaMemcpytoSymbol 用于加载特定的数组,但每个内核是否都使用自己的常量内存分配?相关,是否有绑定和解除绑定的成本类似于绑定纹理的旧成本(也就是说,使用纹理为每个内核调用添加了成本)?

  3. 常量内存驻留在芯片上的哪个位置?

CUDA架构

我主要对与Pascal和Volta有关的答案感兴趣.

cuda gpu-constant-memory

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

在C++中将char-array转换为POD数组

编写下面代码的正确方法是什么?

我有一个内存管理器,它提供了我char *的,但我需要使用数组uint32_t.我如何解决严格的别名规则?我理解,对于单个对象,建议只复制内容,memcpy()但对于一组对象,该解决方案是不可接受的.

char* ptr = manager()->Allocate(1000 * sizeof(uint32_));
uint32_t* u32ptr = reinterpret_cast<uint32_t*>(ptr);
....
u32ptr[x] = y;
Run Code Online (Sandbox Code Playgroud)

c++ pointers dynamic-memory-allocation reinterpret-cast c++11

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

一些以CUDA 9中附加`_sync()`命名的内在函数; 语义相同?

在CUDA 9中,nVIDIA似乎有了这种"合作团体"的新概念; 由于某些原因我不完全清楚,__ballot()现在(= CUDA 9)被弃用赞成__ballot_sync().这是别名还是语义改变了?

...对于其他内置组件的类似问题,现在已__sync()添加到他们的名字中.

cuda ptx gpu-warp

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

多个 CMake 目标的 target_compile_definitions?

有人 告诉我,CFLAGS直接在 CMake 中进行设置是不好的做法,相反,我应该使用该target_compile_definitions()命令。

好的,但是 - 如果我想对多个(独立)目标使用相似/相同的定义怎么办?我不想一遍又一遍地重复自己。

idioms dry cmake compiler-options

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

为什么C++编译器不能在传值方案中优化更多字符串结构?

(这个问题的灵感来自Nicolai Josuttis的CppCon 2017演讲.)

考虑以下源文件(对于对象,而不是完整的程序):

#include <string>

class C {
    std::string s_;
public:
    C(std::string s) : s_(s) { };
    void bar();
};

void foo() {
    std::string hello { "The quick brown fox jumped over the lazy dog" };
    C c { hello };
    c.bar();
}
Run Code Online (Sandbox Code Playgroud)

它的编译结果在GodBolt上.

即使使用-O2(甚至使用-O3),似乎字符串构造函数被调用三次.具体而言,s构造,仅用于构造s_,然后被破坏.我的问题:

  • 是否允许编译器简单地s_从ctor的参数构造,而不是构造s
  • 如果没有,则编译器允许移动,构建s_s,看到后者是如何闲置?
  • 如果之前的任何答案都是"是" - 为什么gcc和clang不这样做?
  • 如果s构造正确,编译器不能避免构造hello,看看它没有其他用途吗?或者至少离开它?

c++ stdstring compiler-optimization copy-elision stdmove

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