当 memcpy 来自 char* 时,C++ 布尔值既不是 0 也不是 1,是否有未定义的行为?

问题描述 投票:0回答:0
#include <stdio.h>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;

bool* library_pad;
vector<unsigned char> my_pad, my_pad2;

int main()
{
    int N = 10000;
    library_pad = new bool[N];
    my_pad.resize(N);
    my_pad2.resize(N);
    
    int sum0 = 0;
    for (int i = 0; i < N; i++) {
        my_pad[i] = i % 256;
        sum0 += my_pad[i];
    }
    cout << sum0 << "\n";
    
    memcpy(library_pad, reinterpret_cast<bool*>(my_pad.data()), N * sizeof(bool));
    int sum1 = 0, weird_count = 0;
    for (int i = 0; i < N; i++) {
        sum1 += library_pad[i];
        if (library_pad[i] != 0 && library_pad[i] != 1) weird_count++;
    }
    cout << sum1 << ", weird_count = " << weird_count << "\n";
    
    memcpy(my_pad2.data(), reinterpret_cast<char*>(library_pad), N * sizeof(char));
    int sum2 = 0;
    for (int i = 0; i < N; i++) sum2 += my_pad2[i];
    cout << sum2 << "\n";

    return 0;
}
// stdout:
// 1273080
// 1273080, weird_count = 0
// 1273080

我正在使用一个库,该库需要将数据放入内存缓冲区

library_pad
,数据类型为
bool*
.

我有一些返回

std::vector<char>
的函数,但保证它们只包含0/1。我不想使用
vector<bool>
因为它是一个假的
std::vector
(它的元素不表示为内存中的连续字节数组)。

如果你

memcpy
喜欢在代码中,布尔值既不能是
0
也不能是
1
。正确的解决方案是使用
for
循环而不是
memcpy
.

这是有意的还是未定义的行为?

编辑: 如果打印出

library_pad
的值,它的值在 0->255 上。但是输出中有
weird_count == 0
,这意味着编译器完全删除了语句

if (library_pad[i] != 0 && library_pad[i] != 1) weird_count++;

可能是因为它假设

bool
总是
0
1
,所以该语句应该总是
false
.

c++ boolean compiler-optimization undefined-behavior memcpy
© www.soinside.com 2019 - 2024. All rights reserved.