相关疑难解决方法(0)

什么时候uint8_t≠unsigned char?

根据C和C++ , CHAR_BIT >= 8.
但无论何时CHAR_BIT > 8,uint8_t甚至都不能表示为8位.
它必须更大,因为它CHAR_BIT是系统上任何数据类型的最小位数.

什么样的系统可以uint8_t合法地定义为除了以外的类型unsigned char?

(如果C和C++的答案不同,那么我想知道两者.)

c c++ types unsigned-char uint8t

59
推荐指数
3
解决办法
2万
查看次数

为什么优化会破坏此功能?

我们最近在大学里开了一个关于多种语言编程特色的讲座.

讲师写下了以下功能:

inline u64 Swap_64(u64 x)
{
    u64 tmp;
    (*(u32*)&tmp)       = Swap_32(*(((u32*)&x)+1));
    (*(((u32*)&tmp)+1)) = Swap_32(*(u32*) &x);

    return tmp;
}
Run Code Online (Sandbox Code Playgroud)

虽然我完全理解这在可读性方面也是非常差的风格,但他的主要观点是这部分代码在生产代码中运行良好,直到它们实现了高优化级别.然后,代码将什么都不做.

他说,变量的所有赋值tmp都将由编译器优化.但为什么会这样呢?

我知道有些情况下变量需要声明为volatile,这样编译器就不会触及它们,即使他认为它们永远不会被读或写,但我不知道为什么会发生这种情况.

c c++ optimization endianness strict-aliasing

49
推荐指数
3
解决办法
4343
查看次数

如何创建一个不破坏严格别名的uint8_t数组?

我最近问了这个问题:

使用此指针会在热循环中导致奇怪的去优化

问题是我正在写一个类型的数组,uint8_t并且编译器将它视为可以使用this方法的指针(类型struct T*)进行别名,因为void*和char*(= uint8_t*)总是可以在C++中对任何其他指针进行别名.此行为导致错过优化机会.当然,我想避免这种情况.所以问题是:我是否可以声明一个uint8_t强制执行严格别名的数组,即编译器将其视为从不与另一种类型的指针混淆?也就是说,我在寻找的东西像一个strict_uint8_t类型,它是一种uint8_t具有特殊混淆的行为.有没有办法实现这个目标?

显示我的意思的示例代码,借用其他问题并简化.有关更多详细信息,请阅读链接的问题及其接受的答案:

struct T{
   uint8_t* target;
   void unpack3bit(char* source, int size) {
        while(size > 0){
           uint64_t t = *reinterpret_cast<uint64_t*>(source);
           /** `this->target` cannot be cached in a register here but has
               to be reloaded 16 times because the compiler
               thinks that `this->target` could alias with `this` itself.
               What I want is a special uint8_t type that does not trigger
               this …
Run Code Online (Sandbox Code Playgroud)

c++ pointers strict-aliasing c++11

8
推荐指数
1
解决办法
921
查看次数

如何拥有类似于 unsigned char 的类型,但不允许别名?

我想要一个类型,如下所示unsigned char:

\n\n
    \n
  • 大小为 1
  • \n
  • 可以为其分配整数值(无需任何强制转换)
  • \n
  • 允许位操作
  • \n
  • 算术是允许的,但不是必须的
  • \n
  • 未签名
  • \n
  • 可以简单地复制
  • \n
\n\n

但是,与 不同的是unsigned char,它不允许使用别名。我的意思是,一种没有例外的类型[basic.lval/11.8]:

\n\n
\n

如果程序尝试通过以下类型之一以外的泛左值访问对象的存储值,则行为未定义:

\n\n

[...]

\n\n
    \n
  • 一个 char,无符号字符或 std\xe2\x80\x8b::\xe2\x80\x8bbyte 类型。
  • \n
\n
\n\n

有可能有这样的类型吗?

\n\n

原因是:我几乎从不使用unsigned char\ 的别名属性。因此,我想使用一种类型,它不会阻止某些类型的优化(注意,我问这个问题是因为我实际上有一些函数,由于允许别名,因此没有很好地优化)的财产unsigned char)。因此,我希望有一种类型能够满足这一点:“不要为不使用的东西付费”。

\n\n
\n\n

这是一个unsigned char阻止优化的示例:使用此指针会导致热循环中奇怪的去优化

\n

c++ c++17

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