小编pha*_*tom的帖子

指向不完整类型的成员函数的指针

我不明白为什么为类添加前向声明会将其指针的大小更改为成员类型

#include <iostream>
using namespace std;

int main()
{
    //struct CL;
    //cout<<sizeof(int (CL::*)())<<endl; 
    struct CL{};
    cout<<sizeof(int (CL::*)())<<endl;
}
Run Code Online (Sandbox Code Playgroud)

输出VS2013:
4

但是如果我取消注释main()中的前两行,那么输出是不同的:
16
16

因此,在struct CL的定义之前只添加一个前向声明只会增加指向CL成员的指针的大小.为什么?我知道成员函数指针的大小取决于类型的结构(例如,虚函数和基类可能会增加它),但为什么sizeof运算符可以应用于指向不完整类型成员的指针?还是不行?我没有在标准中找到它

c++ pointer-to-member incomplete-type

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

为什么不抛出()和noexcept有任何开销?

throw()在C++ 03中作为异常说明符添加,但在C++ 11中对于说明noexcept符已弃用.

在分析了一些代码以找到使用的速度之后throw(),noexcept我发现所有这些函数的函数调用大致相同.

结果:

throw()       noexcept      plain old function
11233 ms      11105 ms      11216 ms
11195 ms      11122 ms      11150 ms
11192 ms      11151 ms      11231 ms
11214 ms      11218 ms      11228 ms

compiled with MinGW using g++ -o test.exe inc.cpp no.cpp -std=c++11 -O3
Run Code Online (Sandbox Code Playgroud)

这是我用来描述的代码:

int main() {
    unsigned long long iter = (unsigned long long)1 << (unsigned long long)40;
    auto t1 = std::chrono::high_resolution_clock::now();

    for(unsigned long long i = 0; i < …
Run Code Online (Sandbox Code Playgroud)

c++ performance c++11

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