相关疑难解决方法(0)

未命名/匿名命名空间与静态函数

C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:

namespace {
    int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)

您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名命名空间可以在它们创建的文件访问,就好像你有一个隐含的using子句.

我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?

c++ namespaces

486
推荐指数
8
解决办法
20万
查看次数

不同的功能有不同的地址吗?

考虑这两个功能:

void foo() {}
void bar() {}
Run Code Online (Sandbox Code Playgroud)

是保证&foo != &bar吗?

同样的,

template<class T> void foo() { }
Run Code Online (Sandbox Code Playgroud)

是保证&foo<int> != &foo<double>吗?


我知道折叠函数定义有两个连接器.

MSVC积极地COMDAT折叠函数,因此具有相同实现的两个函数可以转换为一个函数.作为副作用,这两个函数共享相同的地址.我的印象是这是非法的,但我无法找到标准中的哪些内容是非法的.

Gold链接器还可以折叠功能,包括a safeall设置. safe意味着如果采用了一个功能地址,它就不会折叠,all即使采用了地址也会折叠.因此safe,如果函数具有不同的地址,则黄金的折叠表现为.

虽然折叠可能是意料之外的,并且存在依赖于具有不同地址的不同(相同实现)函数的代码(因此折叠可能是危险的),在当前的C++标准下它实际上是非法的吗?(此时为C++ 14)(自然如果safe折叠是合法的)

c++ function-pointers one-definition-rule language-lawyer comdat-folding

51
推荐指数
4
解决办法
2185
查看次数

在/ OPT:ICF存在的情况下,Visual Studio 2013是否正确优化?

我希望以下程序一直返回0.但是,对于Visual Studio 2013(Update 4),程序在发布版本中退出1.我不确定这是一个错误,还是编译器的优化器是正确的,并且依赖于某些边缘行为.如果关闭CONST宏,则release exe返回0.如果优化器确实正确,我是否可以获得允许它发出代码的原因?

#if 1
#   define CONST const
#else
#   define CONST
#endif


class TypeId {
public:
    bool operator== (TypeId const & other) const
    {
        return id == other.id;
    }

private:
    TypeId (void const * id)
        : id(id)
    {}

public:
    template <typename T>
    static TypeId Get ()
    {
        static char CONST uniqueMemLoc = 0;
        return TypeId(&uniqueMemLoc);
    }

private:
    void const * id;
};


int main(int, char **)
{
    typedef int A;
    typedef unsigned int B;

    if (TypeId::Get<A>() …
Run Code Online (Sandbox Code Playgroud)

c++ optimization c++11 visual-studio-2013

24
推荐指数
2
解决办法
1341
查看次数

链接器错误与静态常量似乎没有使用odr

当你进入细节时(至少对我而言),odr-used标准中的定义非常混乱.我通常依赖于"如果引用"的非正式定义,除非可以使用左值到右值转换.对于积分常数,它们应被视为rvalues,这似乎应该从参考规则中排除.这是我的示例代码无法链接:

class Test
{
public:
    Test();
    static constexpr int MIN_VALUE { 5 };
    int m_otherValue = 10;
};

Test::Test()
{
    m_otherValue = std::max(m_otherValue, MIN_VALUE);
}

int main()
{
    Test t;
}
Run Code Online (Sandbox Code Playgroud)

我得到的链接器错误:

clang++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
/tmp/main-e2122e.o: In function `Test::Test()':
main.cpp:(.text+0x2): undefined reference to `Test::MIN_VALUE'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

现场样本:http://coliru.stacked-crooked.com/a/4d4c27d6b7683fe8

为什么MIN_VALUE要求的定义?它只是一个字面值的常量,编译器应该优化它std::max(m_otherValue, 5).所以我只是不明白.

c++ one-definition-rule c++14

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