关于static_cast的一个问题?

发布于 2022-08-29 22:28:10 字数 2601 浏览 17 评论 0

一下代码是在读《提高C++性能的编程技术》遇到的一个问题,作者本意应该是把size字节大小的内存地址强制转化成NextOnFreeList类型,可编译器一直出错。

环境是:macbook pro 64位

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

代码如下:

#include <ctime>
#include <iostream>
#define MAN_TIMES 10000

using namespace std;

//// version 0.2
class NextOnFreeList{
public:
    NextOnFreeList *next;
};

class Rational{
public:
    Rational(int a = 0,int b = 1):n(a),d(b){};

    inline void *operator new(size_t size);
    inline void operator delete(void *doomed,size_t size);

    static void newMemPool() {expandTheFreeList();}
    static void deleteMemPool();
private:
    static NextOnFreeList *freeList;
    static void expandTheFreeList();
    enum {EXPANSION_SIZE = 32};

    int n;
    int d;
};
inline void* Rational::operator new(size_t size){
    if(0 == freeList){
        expandTheFreeList();
    }
    NextOnFreeList *head = freeList;
    freeList = head->next;

    return head;
}
inline void Rational::operator delete(void *doomed,size_t size){
    NextOnFreeList *head = static_cast<NextOnFreeList *>(doomed);

    head->next = freeList;

    freeList = head;
}

void Rational::expandTheFreeList(){
    size_t size = (sizeof(Rational) > sizeof(NextOnFreeList *))?sizeof(Rational):sizeof(NextOnFreeList *);
    //static_cast 老是报错,为什么啊?
    NextOnFreeList *runner = static_cast<NextOnFreeList *>(new char [size]);

    freeList = runner;

    for(int i = 0;i < EXPANSION_SIZE;i++){
        //static_cast 老是报错,为什么啊?
        runner->next = static_cast<NextOnFreeList*>(new char [size]);
        runner = runner->next;
    }
    runner->next = 0;
}
void Rational::deleteMemPool(){
    NextOnFreeList *nextPtr;
    for(nextPtr = freeList;nextPtr != NULL;nextPtr = freeList){
        freeList = freeList->next;
        delete []nextPtr;
    }
}
int main(){
    clock_t start,end;
    Rational *array[MAN_TIMES];
    Rational::newMemPool();

    start = clock();
    for(int j = 0;j < 500;j++){
        for(int i = 0;i < MAN_TIMES;i++){
            array[i] = new Rational(i);
        }
        for(int j = 0;j < MAN_TIMES;j++){
            delete array[j];
        }
    }

    end = clock();

    cout<<"Run time:"<<(double)(end -  start)/CLOCKS_PER_SEC * 1000<<"ms"<<endl;

    Rational::deleteMemPool();

    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

善良天后 2022-09-05 22:28:10

这种情况用 static_cast 显然是不对的, 你改用 reinterpret_cast 试试呢?

沙沙粒小 2022-09-05 22:28:10

楼主,打打基础吧。。。我都写了好几年c++了。基础好了,性能自然就上去了。不要连基础就没明白就钻研性能问题。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文