| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1161 人关注过本帖
标题:请问这段程序是什么意思
只看楼主 加入收藏
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
结帖率:81.71%
收藏
已结贴  问题点数:20 回复次数:4 
请问这段程序是什么意思
程序代码:
#include <iostream>
class bullet
{
private:
    bool buse = true;
    float x;
    float y;
    float h;
    float damage;
public:
char* mem = new char[1000 * sizeof(bullet)]{};
void* operator new(size_t size)
{
    bullet* bull_ptr = (bullet*)mem;
    for (int i = 0; i < 1000; i++)
    {
        if (!bull_ptr[i].buse)
            return &bull_ptr[i];
    }
}
~bullet()
{
    buse = false;
}
};
int main()
{
    bullet* bul1 = new bullet;
    bullet* bul2 = new bullet;
    bullet* bul3 = new bullet;
    delete bul1;
    bullet* bul4 = new bullet;
    bullet* bul5 = new bullet;

    
    std::cout << bul1 << std::endl;
    std::cout << bul2 << std::endl;
    std::cout << bul3 << std::endl;
    std::cout << bul4 << std::endl;
    std::cout << bul5 << std::endl;
    system("pause");
}

对于这段代码,我有两个问题
当我打印bul1和bul2的地址时,发现相隔
00FC2098
00FC20AC
20个字节,但是我的成员变量却是1+4+4+4+4=17个字节
另外,不是很理解这段代码到底干了啥,题目本意是
假设有1000个子弹,定义1000个子弹的空间
当子弹1释放后,子弹4就要放到子弹1的地址。

[此贴子已经被作者于2023-5-3 17:56编辑过]

搜索更多相关主题的帖子: 代码 std cout float new 
2023-05-03 11:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
但是我的成员变量却是1+4+4+4+4=17个字节
C++要求的是不小于各成员的字节和,而不是正好等于。
为什么这么设计,你可以搜索结构体对齐 https://zh.

另外,不是很理解这段代码到底干了啥
原作者想写个 内存池
只不过,原作者不理解 operator new,导致实现错误(完全的似是而非),设计错误(把buse竟然放到了bullet中),空间浪费效率低下(buse浪费空间,遍历效率低下)
2023-05-03 12:39
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
收藏
得分:0 
回复 2楼 rjsp
那请问我 的这段程序编译后报错,应该怎么修改呢
     C2440    “类型强制转换”: 无法从“unknown”转换为“bullet *”
为什么会这么奇怪,明明声明了mem,到了成员函数体内就行不通了
另外,当我用分文件的方式编写这段代码后,为什么能打印bul1-bul5的地址呢
当new bul1时,for循环里面的条件应该是一个都不符合
因为(非)bull_ptr[i].buse总是为false,按理来说,一个地址都不会返回
也就是不会new成功,可是还是成功打印了地址。不解


2023-05-03 18:31
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:20 
回复 3楼 后卿
我根据你原代码修改了一下(没有你的修改内存池算法)

程序代码:
#include <iostream>
#include <cassert>

class bullet
{
private:
    float x_;
    float y_;
    float h_;
    float damage_;
    
public:
    static void* operator new( size_t size )
    {
        assert( size == sizeof(bullet) );
        for( size_t i=0; i!=1000; ++i )
        {
            if( !mem_mark_[i] )
            {
                mem_mark_[i] = true;
                return (char*)mem_raw_ + i*sizeof(bullet);
            }
        }
        throw std::bad_alloc();
    }
    static void operator delete( void* ptr ) noexcept
    {
        assert( ((char*)ptr-(char*)mem_raw_)%sizeof(bullet) == 0 );
        assert( ((char*)ptr-(char*)mem_raw_)/sizeof(bullet) < 1000 );
        assert( mem_mark_[((char*)ptr-(char*)mem_raw_)/sizeof(bullet)] );
        mem_mark_[((char*)ptr-(char*)mem_raw_)/sizeof(bullet)] = false;
    }
protected:
    static bool* mem_mark_;
    static void* mem_raw_;
};

bool* bullet::mem_mark_ = new bool[ 1000 ]{};
void* bullet::mem_raw_ = ::operator new( 1000*sizeof(bullet), std::align_val_t(alignof(bullet)) );

int main( void )
{
    bullet* bul1 = new bullet;
    bullet* bul2 = new bullet;
    bullet* bul3 = new bullet;
    delete bul1;
    bullet* bul4 = new bullet;
    bullet* bul5 = new bullet;

    std::cout << bul1 << std::endl;
    std::cout << bul2 << std::endl;
    std::cout << bul3 << std::endl;
    std::cout << bul4 << std::endl;
    std::cout << bul5 << std::endl;
}
2023-05-04 09:10
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
收藏
得分:0 
回复 4楼 rjsp
好的好的,非常感谢
2023-05-04 18:17
快速回复:请问这段程序是什么意思
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016080 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved