小编Gra*_*rak的帖子

奇数平台上的std :: byte

阅读Herb Sutter关于最新C++标准会议的博客文章,它注意到std::byte已添加到C++ 17中.作为初步阅读,我有一些担忧,因为它使用,unsigned char以便它可以避免严格的混叠规则的复杂性.

我最关心的是,它如何在CHAR_BIT不是8的平台上运行?我曾经在CHAR_BIT16或32(通常是DSP)的平台上工作.鉴于这std::byte是为了处理"面向字节的内存访问",并且大多数人理解字节以指示八位字节(不是基础字符类型的大小),对于期望这将解决连续的8-的个人来说,这将如何工作?有点大块的记忆?

我已经看到那些只假设CHAR_BIT是8 岁的人(不知道CHAR_BIT存在......).一种被称为std::byte可能会给个人带来更多困惑的类型.


我想我所期望的是他们引入了一种类型,允许对所有情况进行一致的寻址/访问顺序八位字节.有许多面向八位字节的协议,无论CHAR_BIT在给定平台上有什么相同,在所有平台上保证一次访问一个八位字节的库或类型是有用的.

我绝对可以理解,希望能够明确指出某些东西被用作字节序列而不是字符序列,但它看起来并不像许多其他东西那样有用.

c++ c++17

6
推荐指数
1
解决办法
763
查看次数

为什么这个模糊不清?

我有一个我写过的类,它可以进行类型擦除.公共界面是:

template <typename T>
value(const T &t);

value(value &&v);

template <typename T>
operator T() const;
Run Code Online (Sandbox Code Playgroud)

当我从std :: string创建一个值实例时,我没有问题,一切都按预期工作.当我尝试将std :: string退出时,使用static_cast<std::string>(val),其中val是一个包含std :: string的值的实例,我从VS2012获得以下错误:

错误C2440:'static_cast':无法从'value'转换为std :: string'

没有构造函数可以采用源类型,或构造函数重载解析是不明确的

如果我注释掉模板化的强制转换操作符并添加operator std::string() const则编译.我认为std :: string构造函数和模板化的强制转换运算符之间的某些东西具有相同的匹配优势.任何人都可以建议发生了什么以及如何解决它?

c++ c++11

5
推荐指数
3
解决办法
5737
查看次数

glBindVertexBuffer vs glBindBuffer

我看到我可以使用绑定顶点缓冲区glBindBuffer(GL_ARRAY_BUFFER, vbo);.这有效,我也可以使用绑定元素数组glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);.使用这些时,一切都按照需要绘制.

在阅读第10.3.1节中的OpenGL 4.4规范时,我发现了glBindVertexBuffer.看起来这样可以绑定多个顶点缓冲区,然后让它们一次全部渲染.它是否正确?另外,它与使用有glBindBuffer什么不同?在使用此绑定顶点缓冲区时,您可以使用元素数组缓冲区吗?

opengl

5
推荐指数
1
解决办法
3803
查看次数

静态(全局)对象的初始化是如何发生的

我试图弄清楚如何调用全局对象的构造函数.我知道在使用翻译单元的任何内容之前都会调用它们,我对此很好.我试图找出如何在Linux和Windows(x86和x64)中实现这一目标.

我似乎记得Windows(x86)使用链接列表进行构建和销毁,但我无法在此问题上找到任何资源.

我在相关主题上找到了以下材料,但似乎没有任何内容可以涵盖我正在寻找的内容.

和PE文件格式文件.

任何人都可以指出我找到这个信息的正确方向吗?

c++ global-variables c++11

5
推荐指数
1
解决办法
201
查看次数

如何为包含目录设置BUILD_SHARED_LIBS

我有一个非常基本的 CMake 项目,它使用 Google Test。我想将其构建为 dll,并且 gtest 中的 CMakeLists.txt 文件表明BUILD_SHARED_LIBS需要进行设置才能将 gtest 构建为共享库。

我的问题是我不知道如何设置BUILD_SHARED_LIBS才能显示它。如果我使用 cmake-gui 在缓存中设置值,那么我确实会看到生成的构建尝试创建 dll。

下面是我的 CMakeLists.txt。我将不胜感激任何有关如何设置 BUILD_SHARED_LIBS 的建议。

CMAKE_MINIMUM_REQUIRED(VERSION 3.0 FATAL_ERROR)
PROJECT(MyProj)
SET(BUILD_SHARED_LIBS ON)
ADD_EXECUTABLE(MyProj main.cpp)
ADD_LIBRARY(MyLib STATIC mylib.cpp)
TARGET_LINK_LIBRARIES(MyProj MyLib)
ADD_SUBDIRECTORY(gtest-1.7.0)
Run Code Online (Sandbox Code Playgroud)

如果设置了 BUILD_SHARED_LIBS,Google Test 只会构建为共享库 (DLL)。因此我想在这个 CmakeLists.txt 文件中设置它。我知道如何共享我自己的库,但我不知道如何以 gtest CMakeLists.txt 文件看到的方式设置该变量。

cmake

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

是否保证初始化顺序

我正在使用类似以下代码段的内容来进行一些初始化.我知道初始化p<T>::i_是无序的.我相信这h是有序的,所以我应该能够推断出它被初始化的顺序.鉴于标题p包含在定义之前h,是否有任何保证p<T>::i_将在之前初始化h

struct helper
{
   template <typename T>
   helper(const T&, int i)
   {
      p<T>::i_::push_back(i);
   }
};
static helper h;
Run Code Online (Sandbox Code Playgroud)

类p定义如下.

template <typename T>
struct p
{
   static std::vector<int> i_;
};
template <typename T>
std::vector<int> p<T>::i_;
Run Code Online (Sandbox Code Playgroud)

c++ c++11

4
推荐指数
2
解决办法
258
查看次数

全局静态初始化线程

我有一个用互斥体保护的集合。初始化后,它只能被读取,所以我在那里不需要互斥体。

该集合在全局静态初始值设定项中进行初始化和填充。我知道全局静态初始化是在单个翻译单元内保证的。是否可以保证全局静态初始化是单线程的?


我有一个受 Schwarz 计数器保护的静态集合,并由其他静态对象的构造函数填充。该容器与互斥锁相关联。鉴于该集合在启动后是只读的main,如果我可以保证在单个线程中调用静态构造函数,我想摆脱互斥体。

我的理解是,静态初始化顺序通常在单个翻译单元内明确定义,但在翻译单元之间未指定。标准是否允许静态对象由不同的运行时提供的线程初始化/构造?


施瓦茨计数器:

头文件:

struct Init
{
   Init();
   ~Init();
};
namespace
{
   Init _init;
}
extern std::map<int, std::unique_ptr<...>> &protected;
Run Code Online (Sandbox Code Playgroud)

源文件:

namespace
{
   int init_count;
   std::aligned_storage<sizeof(std::map<int, std::unique_ptr<...>>), alignof(std::map<int, std::unique_ptr<...>>>)> protected_storage;
}
std::map<int, std::uniqe_ptr<...>> &protected = *reinterpret_cast<std::map<int, std::unique_ptr<...>> *>(&protected_storage);
Init::Init()
{
   if (!init_counter++)
   {
      new(&protected_storage) std::map<int, std::unique_ptr<...>>();
   }
}
Init::~Init()
{
   if (!--init_counter)
   {
      protected.~std::map<int, std::unique_ptr<...>>();
   }
}
Run Code Online (Sandbox Code Playgroud)

征集人群:

struct helper
{
   helper(...)
   {
      protected.insert(std::make_pair(...));
   }
};
Run Code Online (Sandbox Code Playgroud)

扩展了一个宏,用于创建助手的静态实例。

c++ c++11

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

C 联合类型双关数组

鉴于以下代码,我有一些与类型双关相关的问题。我看不出这没有违反严格的别名规则,但我无法指出具体的违规行为。我最好的猜测是,将联合成员传递到函数中违反了严格的别名。

以下代码位于Compiler Explorer上。

#include <stdint.h>

union my_type
{
    uint8_t m8[8];
    uint16_t m16[4];
    uint32_t m32[2];
    uint64_t m64;
};

int func(uint16_t *x, uint32_t *y)
{
    return *y += *x;
}

int main(int argc, char *argv[])
{
    union my_type mine = {.m64 = 1234567890};
    return func(mine.m16, mine.m32);
}
Run Code Online (Sandbox Code Playgroud)

我的观察:

  • 假设参数func不互相别名,func则不违反严格别名。
  • 在 C 语言中,允许使用unionfor 类型双关。
  • 通过m16m32进入func必须违反某些内容。

我的问题:

  • 像这样的数组类型双关有效吗?
  • 我将指针传递给 到底违反了什么func
  • 在这个例子中我还遗漏了哪些其他问题?

c c99 c11

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

使用std :: copy从随机数分发中复制

在C++ 98中,我可以使用std :: copy使用迭代器适配器从输入流复制到std :: vector.有没有办法从新的C++ 11随机数库中做类似的事情?

我希望能做的是:

std::uniform_int_distribution<int> dist(0, 1024);
std::vector<int> col;
std::copy(std::adapter_type(dist), std::adapter_type(dist, 128), std::back_inserter(col));
Run Code Online (Sandbox Code Playgroud)

其中"结束"迭代器必须有某种方法来限制向量中插入的数量.而且,是的,我知道我需要某种类型的引擎才能使分发工作.

c++ c++11

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

变量声明和定义不匹配

我正在使用C89编译器(嵌入式系统).

我遇到了一些C代码,其中一个翻译单元将变量定义为bool varName;,其中boola typedefunsigned char.另一个转换单位转发声明变量如下:extern char varName;.

这显然是一种类型不匹配,并且是一个错误.我的问题是,这违反了什么确切的规则?我的下意识反应是它违反了ODR,但是只有一个定义,所以我不相信这是ODR违规.

c c89

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

标签 统计

c++ ×6

c++11 ×5

c ×2

c++17 ×1

c11 ×1

c89 ×1

c99 ×1

cmake ×1

global-variables ×1

opengl ×1