相关疑难解决方法(0)

const-correctness可以提高性能吗?

我已多次阅读过,在C或C++代码中强制执行const-correctness不仅是一个关于可维护性的好习惯,而且它可能允许编译器执行优化.但是,我也完全相反 - 它根本不会影响性能.

因此,您是否有一些示例,其中const正确性可以帮助您的编译器提高程序的性能?

c++ performance const-correctness

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

std ::对象的向量和const-correctness

考虑以下:

class A {
public:
    const int c; // must not be modified!

    A(int _c)
    :   c(_c)
    {
        // Nothing here
    }

    A(const A& copy)
    : c(copy.c)
    {
        // Nothing here
    }    
};



int main(int argc, char *argv[])
{
    A foo(1337);

    vector<A> vec;
    vec.push_back(foo); // <-- compile error!

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

显然,复制构造函数是不够的.我错过了什么?

编辑:Ofc.我无法在operator =()方法中更改this-> c,因此我没有看到如何使用operator =()(尽管std :: vector需要).

c++ vector const-correctness

15
推荐指数
3
解决办法
4454
查看次数

是否未定义行为抛弃函数参数的常量?

想象一下,我有这个C函数(以及头文件中的相应原型)

void clearstring(const char *data) {
    char *dst = (char *)data;
    *dst = 0;
}
Run Code Online (Sandbox Code Playgroud)

有未定义行为在上面的代码,铸造const,或者是它只是一个非常不好的编程习惯?

假设没有使用const限定对象

char name[] = "pmg";
clearstring(name);
Run Code Online (Sandbox Code Playgroud)

c casting const undefined-behavior language-lawyer

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

带有指向非常量的指针和指向相同地址的常量参数的指针的函数调用

我想编写一个函数,输入一个数据数组并使用指针输出另一个数据数组。

我想知道如果两者都指向同一个地址会产生什么结果srcdst因为我知道编译器可以针对 const 进行优化。这是未定义的行为吗?(我标记了 C 和 C++,因为我不确定它们之间的答案是否不同,我想了解两者。)

void f(const char *src, char *dst) {
    dst[2] = src[0];
    dst[1] = src[1];
    dst[0] = src[2];
}

int main() {
    char s[] = "123";
    f(s,s);
    printf("%s\n", s);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

除了上面的问题,如果我删除const原来的代码,这个定义是否明确?

c c++ constants undefined-behavior

15
推荐指数
2
解决办法
549
查看次数

C++:为什么const_cast是邪恶的?

我一直听到这句话,但我无法真正找到const_cast是邪恶的原因.

在以下示例中:

template <typename T>
void OscillatorToFieldTransformer<T>::setOscillator(const SysOscillatorBase<T> &src)
{
    oscillatorSrc = const_cast<SysOscillatorBase<T>*>(&src);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用引用,并使用const,我保护我的引用不被更改.另一方面,如果我不使用const_cast,代码将无法编译.为什么const_cast在这里不好?

这同样适用于以下示例:

template <typename T>
void SysSystemBase<T>::addOscillator(const SysOscillatorBase<T> &src)
{
    bool alreadyThere = 0;
    for(unsigned long i = 0; i < oscillators.size(); i++)
    {
        if(&src == oscillators[i])
        {
            alreadyThere = 1;
            break;
        }
    }
    if(!alreadyThere)
    {
        oscillators.push_back(const_cast<SysOscillatorBase<T>*>(&src));
    }
}
Run Code Online (Sandbox Code Playgroud)

请给我一些例子,我可以看到使用const_cast是一个坏主意/不专业.

谢谢你的任何努力:)

c++ pointers casting const const-cast

14
推荐指数
3
解决办法
9538
查看次数

是否允许在const定义的对象上抛弃const,只要它实际上没有被修改?

是否允许以下​​内容:

const int const_array[] = { 42 };

int maybe_inc(bool write, int* array) {
  if (write) array[0]++;
  return array[0];
}

int main() {
  return maybe_inc(false, const_cast<int *>(const_array));
}
Run Code Online (Sandbox Code Playgroud)

特别地,它是确定以铸远的常量性const_array,将其定义为const,只要对象是不实际修改,如在实施例?

c++ const const-cast undefined-behavior

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

在构造函数中初始化多个相关const属性的最简单方法?

当C++类的多个const属性依赖于某些中间计算时,初始化它们的最简单方法是什么?

例如,如何更正下面类的构造函数?

class MyClass {
public:
    const int a;
    const int b;

    MyClass() {
        int relatedVariable = rand() % 250;
        a = relatedVariable % 100;
        b = abs(relatedVariable - 150);
    }
};
Run Code Online (Sandbox Code Playgroud)

c++ constructor const

10
推荐指数
2
解决办法
5072
查看次数

什么是const_cast的合法使用

与帮助const_cast,如果有一个人是要修改我的声明常量对象又是什么用的const预选赛?

我的意思是有人如何确保他所宣称的const不会被修改?

c++ const

10
推荐指数
3
解决办法
1189
查看次数

const_cast的未定义行为

我希望有人能够准确地澄清C++中未定义行为的含义.给定以下类定义:

class Foo
{
public:
    explicit Foo(int Value): m_Int(Value) { }
    void SetValue(int Value) { m_Int = Value; }

private:
    Foo(const Foo& rhs);
    const Foo& operator=(const Foo& rhs);

private:
    int m_Int;
};
Run Code Online (Sandbox Code Playgroud)

如果我已经正确理解了以下代码中的引用和指针的两个const_casts将删除Foo类型的原始对象的常量,但是通过指针或引用修改此对象的任何尝试都将导致未定义的行为.

int main()
{
    const Foo MyConstFoo(0);
    Foo& rFoo = const_cast<Foo&>(MyConstFoo);
    Foo* pFoo = const_cast<Foo*>(&MyConstFoo);

    //MyConstFoo.SetValue(1);   //Error as MyConstFoo is const
    rFoo.SetValue(2);           //Undefined behaviour
    pFoo->SetValue(3);          //Undefined behaviour

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

让我感到困惑的是为什么这似乎有效并将修改原始的const对象,但是甚至没有提示我发出警告通知我这种行为是未定义的.从广义上讲,我知道const_casts是不受欢迎的,但是我可以想象一种情况是缺乏对C风格的强制转换可以导致const_cast的意识,而不会被注意到,例如:

Foo& rAnotherFoo = (Foo&)MyConstFoo;
Foo* pAnotherFoo = (Foo*)&MyConstFoo;

rAnotherFoo->SetValue(4);
pAnotherFoo->SetValue(5);
Run Code Online (Sandbox Code Playgroud)

在什么情况下这种行为会导致致命的运行时错误?是否有一些编译器设置可以设置为警告我这种(可能)危险的行为?

注意:我使用的是MSVC2008.

c++ const-cast undefined-behavior

9
推荐指数
2
解决办法
2793
查看次数

通过const_cast删除const并调用不修改结果对象的非const函数是否安全?

我知道const应该谨慎地进行抛弃- 并且任何const从初始const对象中删除-ness 然后修改对象的尝试都会导致未定义的行为.如果我们想删除const-ness以便我们可以调用一个不修改对象的非const函数,该怎么办?我知道我们应该实际标记这样的功能const,但是假设我使用的是一个没有const可用版本的"坏"代码.

那么,总结一下,下面的代码是"安全的"吗?我的猜测是,只要你没有最终修改对象你就可以了,但我不是百分百肯定.

#include <iostream>

struct Foo
{
    void f() // doesn't modify the instance, although is not marked const
    {
        std::cout << "Foo::f()" << std::endl;
    }
};

int main()
{
    const Foo foo;
    const_cast<Foo&>(foo).f(); // is this safe?
}
Run Code Online (Sandbox Code Playgroud)

c++ const-cast

9
推荐指数
3
解决办法
4990
查看次数