我在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)
为什么两个结构 - 完全相同 - 采用不同的字节数?
malloc
使用brk
/ sbrk
作为从OS声明内存的主要方式的典型实现。但是,它们还用于mmap
获取大容量分配的块。使用brk
代替确实有真正的好处mmap
,还是仅仅是传统?将其与所有内容一起使用mmap
是否会很好?
(注意:我在这里可以互换使用sbrk
,brk
因为它们是同一个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年。]
更新:更多地考虑这一点,关于“按优先顺序”的一点让我对询问保持了一致。为什么选择优先顺序?它们是否只是sbrk
在mmap
不支持(或缺少必要功能)的情况下用作备用,还是该进程可能进入可以使用sbrk
但不能使用的状态mmap
?我看一下他们的代码,看看是否能弄清楚它在做什么。
我之所以问是因为我正在用C实现垃圾回收系统,到目前为止,我看不到除之外的任何用途mmap
。我想知道是否还有什么我想念的。
(就我而言,我还有另一个避免使用的原因brk
,那就是malloc
在某些时候可能需要使用。)
这段代码:
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) 我有这个代码
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) 我遇到了一个错误,我无法在任何地方找到任何提及.我正在使用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的丰富经验,所以可能是我在设置中缺少一些常见问题.