小编qua*_*ark的帖子

两个类可以使用C++看到对方吗?

所以我有一个A类,我想调用一些B类函数.所以我加上"bh".但是,在B类中,我想调用一个A类函数.如果我包含"啊",它会以无限循环结束,对吧?我能做些什么呢?

c++ class include forward-declaration

21
推荐指数
3
解决办法
2万
查看次数

缓存线对齐(需要澄清文章)

我最近在应用程序中遇到了我认为是错误共享的问题,我查阅了Sutter关于如何将数据与缓存行对齐的文章.他建议使用以下C++代码:

// C++ (using C++0x alignment syntax)
template<typename T>
struct cache_line_storage {
   [[ align(CACHE_LINE_SIZE) ]] T data;
   char pad[ CACHE_LINE_SIZE > sizeof(T)
        ? CACHE_LINE_SIZE - sizeof(T)
        : 1 ];
};
Run Code Online (Sandbox Code Playgroud)

我可以看到当这CACHE_LINE_SIZE > sizeof(T)是真的时它会如何工作- 结构cache_line_storage最终会占用一个完整的内存缓存行.但是,当sizeof(T)大于单个缓存行时,我认为我们应该按CACHE_LINE_SIZE - T % CACHE_LINE_SIZE字节填充数据,以便生成的结构的大小是缓存行大小的整数倍.我的理解有什么问题?为什么填充1个字节就足够了?

c++ multithreading caching memory-alignment c++11

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

C++通过引用传递指针并分配默认值

我想通过引用一个函数传递一个指针,这样我实际上可以改变传递指针所指向的地址,并且我想为这个参数赋一个默认值.

这样的事情:

在声明中

void myFunc(SomeType* &var=NULL);
Run Code Online (Sandbox Code Playgroud)

和定义:

void MyClass::myFunc(SomeType* &var){
    if(var!=NULL)
        (*var)=(*someOtherPointer);

    if(someCondition)
        var=NULL;
}
Run Code Online (Sandbox Code Playgroud)

这样被调用者可以决定是否要用一个参数或没有参数调用该函数.并且如果他决定传递一个参数,并且someCondition成立,则传递的指针将在之后指向NULL

然而 - 如果我尝试这样做我得到一个:

错误C2440:'默认参数':'int'无法转换为'SomeType*&'

谢谢您的帮助!

c++ pointers reference default-value

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

malloc()和堆内存

我在以下C代码中得到一个奇怪的结果.

int main()
{
    int *p = (int *) malloc(100);
    p[120] = 5;
    printf("\n %d", p[120]);
}
Run Code Online (Sandbox Code Playgroud)

由于我只分配了100个字节,因此该代码应该导致分段错误.但是,它打印'5'并且不会给出任何运行时错误.有人可以解释原因吗?

c memory

5
推荐指数
2
解决办法
7886
查看次数

帮助我改进这个C++位缓冲区处理代码

我正在编写一个函数来处理传入的32位缓冲区,表示在与相应的存储32位缓冲区进行比较时更改数据.更改位的位置表示需要处理的数字(即,值8表示位3),以及更改是0-> 1还是1-> 0.这是目前的实施,请帮我改进一下!请注意,这不是实际代码,它已被简化为与上下文无关.

uint32_t temp = oldBuffer ^ newBuffer;
uint32_t number = 0;
while (temp != 0)
{
    if (temp & 0x1)
    {
        uint32_t bitValue = 0;
        if ((newBuffer& (1 << number)) != 0) bitValue = 1;
        processNumber(number, bitValue);
    }
    number++;
    temp = temp >> 1;
}
oldBuffer = newBuffer;
Run Code Online (Sandbox Code Playgroud)

现在它可以工作,但我不喜欢它必须检查每一位,检查位1并转移整个事情.如果有保证只有1位设置,这不会太难以弄清楚,但事实并非如此.

编辑:对于Neil,我想我希望找到一种方法来在恒定时间内获得XOR之后的位置,而不是一直移动缓冲区并逐个检查位.

c c++ bit-manipulation

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