相关疑难解决方法(0)

什么是右值,左值,x值,glvalues和prvalues?

在C++ 03中,表达式是rvaluelvalue.

在C++ 11中,表达式可以是:

  1. 右值
  2. 左值
  3. x值
  4. glvalue
  5. prvalue

两类已成为五大类.

  • 这些新的表达类别是什么?
  • 这些新类别如何与现有的左值和左值类别相关联?
  • C++ 0x中的右值和左值类别是否与它们在C++ 03中的相同?
  • 为什么需要这些新类别?是WG21神只是想迷惑我们凡人?

c++ expression c++-faq c++11

1291
推荐指数
13
解决办法
17万
查看次数

什么是严格别名规则?

当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?

c strict-aliasing undefined-behavior type-punning

778
推荐指数
10
解决办法
19万
查看次数

"解除引用类型惩罚指针将破坏严格别名规则"警告

我使用一个代码,我将枚举*转换为int*.像这样的东西:

enum foo { ... }
...
foo foobar;
int *pi = reinterpret_cast<int*>(&foobar);
Run Code Online (Sandbox Code Playgroud)

在编译代码(g ++ 4.1.2)时,我收到以下警告消息:

dereferencing type-punned pointer will break strict-aliasing rules
Run Code Online (Sandbox Code Playgroud)

我用Google搜索了这条消息,发现只有在严格的别名优化打开时才会发生这种情况.我有以下问题:

  • 如果我留下带有此警告的代码,它是否会生成可能错误的代码?
  • 有没有办法解决这个问题?
  • 如果没有,是否可以从源文件内部关闭严格别名(因为我不想为所有源文件关闭它,我不想为此源文件制作单独的Makefile规则)?

是的,我实际上需要这种别名.

c++ warnings strict-aliasing

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

严格的别名规则和'char*'指针

什么是严格别名规则的接受答案提到您可以使用char *别名而不是其他方式.

这对我来说没有意义 - 如果我们有两个指针,一个是指向同一个位置的类型char *,另一个struct something *指向同一个位置,那么第一个别名可能是第二个但第二个不是第一个别名吗?

c c++ strict-aliasing

20
推荐指数
2
解决办法
4115
查看次数

设置char*的缓冲区,中间转换为int*

我无法完全理解我在这里阅读的内容的后果:将一个int指针转换为char ptr,反之亦然

总之,这会有用吗?

set4Bytes(unsigned char* buffer) {
  const uint32_t MASK = 0xffffffff;
  if ((uintmax_t)buffer % 4) {//misaligned
     for (int i = 0; i < 4; i++) {
       buffer[i] = 0xff;
     } 
  } else {//4-byte alignment
    *((uint32_t*) buffer) = MASK;
  }

}
Run Code Online (Sandbox Code Playgroud)

编辑
有一个长时间的讨论(它是在评论中,神秘地删除了)关于指针应该被铸造到什么类型以检查对齐.现在讨论这个问题.

c c++ memory pointers

10
推荐指数
1
解决办法
1939
查看次数

我是否正确理解C/C++严格别名?

我读过这篇关于C/C++严格别名的文章.我认为同样适用于C++.

据我了解,严格别名用于重新排列代码以进行性能优化.这就是为什么两个不同(在C++情况下不相关)类型的指针不能引用相同的内存位置的原因.

这是否意味着只有在修改内存时才会出现问题?除了内存对齐可能存在的问题.

例如,处理网络协议或反序列化.我有一个字节数组,动态分配和数据包结构正确对齐.我reinterpret_cast可以使用我的数据包结构吗?

char const* buf = ...; // dynamically allocated
unsigned int i = *reinterpret_cast<unsigned int*>(buf + shift); // [shift] satisfies alignment requirements
Run Code Online (Sandbox Code Playgroud)

c c++ strict-aliasing

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

可以使用const变量避免混淆问题

我的公司使用消息服务器将消息const char*收集到a中,然后将其转换为消息类型.

在提出这个问题之后,我对此感到担忧.我不知道消息服务器中有任何不良行为.const变量是否可能不会出现锯齿问题?

例如,假设foo是以下列MessageServer方式之一定义的:

  1. 作为参数: void MessageServer(const char* foo)
  2. 或者作为顶部的const变量MessageServer:const char* foo = PopMessage();

现在MessageServer是一个巨大的功能,但它从来没有指派任何事情foo在1点但是,MessageServer的逻辑foo 被转换为所选择的消息类型.

auto bar = reinterpret_cast<const MessageJ*>(foo);
Run Code Online (Sandbox Code Playgroud)

bar 将仅从随后读取,但将广泛用于对象设置.

这里是否存在别名问题,或者foo只是初始化并且从未修改过的事实会保存我吗?

编辑:

Jarod42的回答中找到与从铸造没有问题const char*MessageJ*,但我不知道这是有道理的.

我们知道这是非法的:

MessageX* foo = new MessageX;
const auto bar = reinterpret_cast<MessageJ*>(foo);
Run Code Online (Sandbox Code Playgroud)

我们是否以某种方式说这是合法的?

MessageX* foo = new MessageX;
const auto temp = reinterpret_cast<char*>(foo);
auto bar = reinterpret_cast<const MessageJ*>(temp); …
Run Code Online (Sandbox Code Playgroud)

c++ alias const strict-aliasing reinterpret-cast

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

Char指向Int指针转换不起作用

关于铸造,我很困惑char to int pointer.我正在检查指针的转换是如何工作的,以下代码int to char工作正常.

#include <iostream>
using namespace std;
int main(){
    int a=65;
    void *p=&a;
    cout << *static_cast<char*>(p);
}
Run Code Online (Sandbox Code Playgroud)

产量

A
Run Code Online (Sandbox Code Playgroud)

但是,当我试图从char to int它投出时没有显示正确的价值.

#include <iostream>
using namespace std;
int main(){
    char a='A';
    void *p=&a;
    cout << *static_cast<int*>(p);

}
Run Code Online (Sandbox Code Playgroud)

上面的代码有什么问题?输出是关于垃圾值.

c++

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