小编Nat*_*C-K的帖子

c结构中的压缩位字段 - GCC

我在linux上使用c中的结构.我开始使用位字段和"打包"属性,我遇到了一个奇怪的行为:

struct t1
{
    int a:12;
    int b:32;
    int c:4;
}__attribute__((packed));

struct t2
{
    int a:12;
    int b;
    int c:4;
}__attribute__((packed));

void main()
{
    printf("%d\n",sizeof(t1)); //output - 6
    printf("%d\n",sizeof(t2)); //output - 7
}
Run Code Online (Sandbox Code Playgroud)

为什么两个结构 - 完全相同 - 采用不同的字节数?

c gcc struct packed bit-fields

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

在malloc中,为什么要完全使用brk?为什么不只使用mmap?

malloc使用brk/ sbrk作为从OS声明内存的主要方式的典型实现。但是,它们还用于mmap获取大容量分配的块。使用brk代替确实有真正的好处mmap,还是仅仅是传统?将其与所有内容一起使用mmap是否会很好?

(注意:我在这里可以互换使用sbrkbrk因为它们是同一个Linux系统调用接口brk。)


作为参考,以下是一些描述glibc malloc的文档:

GNU C库参考手册:GNU分配器
https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.html

glibc Wiki:Malloc概述
https://sourceware.org/glibc/wiki/MallocInternals

这些文件所描述的是,它sbrk被用来声明一个小的分配的主要场所,mmap被用来声明一个次级的场所,mmap还被用来声明一个大对象(“比页面大得多”)的空间。

同时使用应用程序堆(带有sbrk),并mmap引入了一些其他不必要的复杂性:

分配的竞技场-主竞技场使用应用程序的堆。其他竞技场使用mmap堆。要将块映射到堆,您需要知道哪种情况适用。如果该位为0,则该块来自主区域和主堆。如果该位为1,则该块来自mmap的内存,并且可以从该块的地址计算出堆的位置。

[Glibc malloc源自ptmalloc,而ptmalloc则源自dlmalloc,后者始于1987年。]


jemalloc手册页(http://jemalloc.net/jemalloc.3.html)有这样一段话:

传统上,分配器使用sbrk(2)获取内存,由于一些原因,该内存不是最佳的,原因包括竞争条件,增加的碎片以及人为限制最大可用内存。如果操作系统支持sbrk(2),则此分配器将按优先顺序使用mmap(2)和sbrk(2);否则,此分配器将使用mmap(2)和sbrk(2)。否则,仅使用mmap(2)。

因此,他们甚至在这里说这sbrk不是次优的,但是无论如何他们还是会使用它,即使他们已经为编写代码而烦恼,以至于没有它就可以工作。

[jemalloc的编写始于2005年。]

更新:更多地考虑这一点,关于“按优先顺序”的一点让我对询问保持了一致。为什么选择优先顺序?它们是否只是sbrkmmap不支持(或缺少必要功能)的情况下用作备用,还是该进程可能进入可以使用sbrk但不能使用的状态mmap?我看一下他们的代码,看看是否能弄清楚它在做什么。


我之所以问是因为我正在用C实现垃圾回收系统,到目前为止,我看不到除之外的任何用途mmap。我想知道是否还有什么我想念的。

(就我而言,我还有另一个避免使用的原因brk,那就是malloc在某些时候可能需要使用。)

c linux malloc mmap brk

8
推荐指数
5
解决办法
557
查看次数

如何在MouseOver上更改wx.Panel背景颜色?

这段代码:

import wx

app = None

class Plugin(wx.Panel):
    def __init__(self, parent, *args, **kwargs):
        wx.Panel.__init__(self, parent, *args, **kwargs)
        self.SetBackgroundColour((11, 11, 11))
        self.name = "plugin"

        self.Bind(wx.EVT_ENTER_WINDOW, self.onMouseOver)
        self.Bind(wx.EVT_LEAVE_WINDOW, self.onMouseLeave)

        wx.EVT_ENTER_WINDOW(self, self.onMouseOver)
        wx.EVT_LEAVE_WINDOW(self, self.onMouseLeave)

    def onMouseOver(self, event):
        self.SetBackgroundColor((179, 179, 179))
        self.Refresh()

    def onMouseLeave(self, event):
        self.SetBackgroundColor((11, 11, 11))
        self.Refresh()

    def OnClose(self, event):
        self.Close()
        app.Destroy()

    def name():
        print self.name


app = wx.App()
frame = wx.Frame(None, -1, size=(480, 380))
Plugin(frame)
frame.Show(True)
app.MainLoop()
Run Code Online (Sandbox Code Playgroud)

给我错误:

Traceback (most recent call last):
  File "C:\.... ... ....\plugin.py", line 18, in onMouseOver …
Run Code Online (Sandbox Code Playgroud)

python wxwidgets wxpython panel

5
推荐指数
1
解决办法
1万
查看次数

Python:"IN"(列表)如何工作?

我有这个代码

list = ['a','b','c']

if 'b' in list:
   return "found it"
return "not found"
Run Code Online (Sandbox Code Playgroud)

现在,这是如何工作的?它是否遍历比较元素的整个列表?它是否使用某种哈希函数?

此外,此代码是否相同?

list.index('b')
Run Code Online (Sandbox Code Playgroud)

python list data-structures

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

奇怪的Javascript JSON未定义错误

我遇到了一个错误,我无法在任何地方找到任何提及.我正在使用ASP.NET开发支持AJAX的WCF Web服务.在我的ASP.NET母版页的<asp:ScriptManager>中,我包含了json.js文件,该文件是从json.org复制的.当我运行该页面时,它在json.js中的第一行代码(遵循大量注释)失败(VS 2008捕获Javascript异常),这是:

JSON = JSON || {};
Run Code Online (Sandbox Code Playgroud)

该错误表明JSON未定义:

Microsoft JScript运行时错误:'JSON'未定义

好吧,呃!这就是为什么线路正在测试它是否被定义,如果是这样,将它设置为空对象!它应该是未定义的,对吧?最后我听说在Javascript中对未定义的变量执行此类操作不是错误.

谁能给我一个关于这里发生了什么的线索?我怀疑其他地方出了问题,不知何故导致了这个问题.我没有使用Javascript或ASP.NET的丰富经验,所以可能是我在设置中缺少一些常见问题.

javascript asp.net json undefined

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