如何在char*不指定大小的情况下将无限字符读入变量?
例如,假设我想要读取也可能需要多行的员工的地址.
我目前正在研究malloc()Windows下的实现.但在我的研究中,我偶然发现了困扰我的事情:
首先,我知道在API级别,windows主要使用HeapAlloc()和VirtualAlloc()调用来分配内存.我从这里开始收集微软的实现malloc()(包含在CRT中 - C运行时)基本上要求HeapAlloc()块> 480字节,否则管理VirtualAlloc()为小分配分配的特殊区域,以防止碎片.
那一切都很好,很好.但是还有其他一些实现malloc(),例如nedmalloc,它声称比微软快了125%malloc.
所有这些让我想到了一些事情:
为什么我们不能只召唤HeapAlloc()小块?在碎片方面表现不佳(例如通过"先适合"而不是"最适合")?
是什么nedmalloc比微软更快malloc?
从上面的内容来看,我的印象是HeapAlloc()/ VirtualAlloc()速度太慢,以至于malloc()只是偶尔调用一次然后管理分配的内存本身要快得多.这个假设是真的吗?或者是malloc()因为碎片而需要的"包装"?有人会认为像这样的系统调用会很快 - 或者至少会有一些想法被放入其中以使它们有效.
平均而言,典型malloc调用执行了多少(一个数量级)的内存读/写(可能是已分配段数的函数)?我会直观地说它是一个普通程序的十位,我是对的吗?
windows malloc memory-management dynamic-memory-allocation nedmalloc
我有较大的CT原始数据文件,最大可能超过20到30GB。对于该部门中当前的大多数计算机,我们最多只能使用3GB。但是对于处理数据,我们需要遍历所有可用数据。当然,我们可以通过依次通过读取和写入功能遍历数据来做到这一点。但是有时有必要将一些数据保留在内存中。
当前,我有自己的内存管理,在其中创建了一个所谓的MappableObject。每个原始数据文件都包含20000个结构,每个结构均显示不同的数据。每个MappableObject引用文件中的一个位置。
在C#中,我创建了某种程度上起作用的机制,该机制在必要时自动对数据进行mp和取消映射。从几年前我就知道MemoryMappedFiles,但是在.NET 3.5中,我拒绝使用它,因为我知道在.NET 4.0中,它可以在本地使用。
因此,今天我尝试了MemoryMappedFiles,发现不可能分配需要的内存。如果我有32位系统,而我想分配20GB,则由于超出逻辑地址空间的大小,因此无法使用。这对我来说很清楚。
但是,有没有办法处理像我这样的大文件?我还有其他机会吗?你们如何解决这些问题?
谢谢马丁
这些可能是在c ++中声明数组(并为它们分配内存)的两种方法中的两种
1. int a[3];
2. int *b = new int[3];
Run Code Online (Sandbox Code Playgroud)
我想了解c ++如何以不同的方式处理这两者.
一个.在这两种情况下,我都可以使用以下语法访问数组:a[1]和b[1]
湾 当我尝试cout<< a和cout<< b,都打印相应数组的第一个元素的地址.
它看起来好像a和b都被视为指向数组的第一个元素的指针.
C.但奇怪的是,当我尝试这样做时cout << sizeof(a),sizeof(b)他们分别打印出不同的值 - 分别为4和12.
我不明白为什么在这种情况下sizeof(b),正在打印整个数组的大小.
c++ arrays pointers memory-management dynamic-memory-allocation
这有点复杂; 我欢迎任何关于如何提高问题清晰度的意见.
好吧,说我有一个数组:
real, allocatable :: A(:,:,:)
Run Code Online (Sandbox Code Playgroud)
我想在使用它之前分配它.第三维的大小是否可能取决于第二维的大小?
例如
do i=1,n
allocate(A(3,i,i**2))
end do
Run Code Online (Sandbox Code Playgroud)
显然以上都行不通.我想最终得到一个带有形状的数组(或一组数组)
(3,1,1), (3,2,4), (3,3,9), ... (3, n, n^2)
Run Code Online (Sandbox Code Playgroud)
其中第三维的大小是第二维的大小的平方.
我对依赖维度大小的规则有点复杂,但如果可以进行平方,我可以做其余的事情.
这可能吗?如果是这样,我如何在Fortran中实现它?
会有什么shape(A)回报?那会很有趣.
我的另一种选择是分配到所需的最大尺寸,并注意只在计算中使用某些元素,即
allocate(A(3,n,n**2))
Run Code Online (Sandbox Code Playgroud)
虽然我现在对记忆并不苛刻,但我希望有良好的编程习惯.无论如何,这是一个有趣的问题.
谢谢.
编辑:
如果维度的大小取决于另一维度中元素的值?
在下面的答案中,两个维度中数组的大小取决于B的索引.我想要的是某些东西
type myarray
real :: coord(3)
integer,allocatable :: lev(:)
integer, allocatable :: cell(:)
endtype myarray
type(myarray), allocatable :: data
allocate(data(m))
allocate(data%lev(n))
forall (j=1:n) !simple now, for argument's sake
lev(j)=j
endforall
! I was thinking of using a FORALL loop here, but the errors returned …Run Code Online (Sandbox Code Playgroud) 我正在使用malloc编写代码然后遇到问题所以我写了一个测试代码,它实际上总结了下面的整个混乱::
# include <stdio.h>
# include <stdlib.h>
# include <error.h>
int main()
{
int *p = NULL;
void *t = NULL;
unsigned short *d = NULL;
t = malloc(2);
if(t == NULL) perror("\n ERROR:");
printf("\nSHORT:%d\n",sizeof(short));
d =t;
(*d) = 65536;
p = t;
*p = 65536;
printf("\nP:%p: D:%p:\n",p,d);
printf("\nVAL_P:%d ## VAL_D:%d\n",(*p),(*d));
return 0;
}
Output:: abhi@ubuntu:~/Desktop/ad/A1/CC$ ./test
SHORT:2
P:0x9512008: D:0x9512008:
VAL_P:65536 ## VAL_D:0
Run Code Online (Sandbox Code Playgroud)
我使用malloc 分配2个字节的内存.返回void*指针的 Malloc 存储在void*指针't'中.
然后在那之后指出2个指针p - 整数类型和d - 短类型.然后我将t分配给它们*(p = …
因此,我想我已经在网络上进行了彻底的搜索,发现没有什么真正有用的(最多只是令人困惑……)。
我想知道如何(如果可能)将Qt与非动态内存配合使用。我面临的问题是,对于许多小部件,我确切地知道我想要使用什么(这些子小部件,这些布局,固定数量等)。但是,当您不使用动态内存时,Qt中的所有内容似乎都会受到影响。一个简单的示例是QLayout,它来自Qt文档,旨在对所添加内容的所有权。所以基本上,下面的代码:
//In header
class ThumbnailDialog : public QDialog
{
Q_OBJECT
public:
ThumbnailDialog(QWidget* parent = 0);
~ThumbnailDialog(void);
private:
QPushButton m_confirm;
QPushButton m_cancel;
QHBoxLayout m_buttonsLayout;
};
//Implementation of ctor
ThumbnailDialog::ThumbnailDialog(QWidget* parent):
QDialog(parent)
{
//...
m_buttonsLayout.addWidget(&m_confirm);
m_buttonsLayout.addWidget(&m_cancel);
//...
setLayout(&m_dialogLayout);
}
Run Code Online (Sandbox Code Playgroud)
...将最终(在MSVC上)导致调试断言失败,_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)因为在ThumbnailDialogdtor中,布局试图删除按钮...显然不应该这样做。
因此,像“ Qt Expert”所提倡的那样,我是否被迫在所有地方都使用动态记忆(虽然提到了“堆”……)?这似乎是错误的,因为这阻止了RAII的使用(如果父子关系意味着将进行删除,那么我不能使用智能指针来执行此操作)。对于编译时已知的内容,诉诸动态内存也感觉非常错误……(但是我可能是错的,这只是我的感觉)。
所以:有没有一种方法可以使用Qt而不new为每个小部件/布局使用动态内存和s?
在分配指针之前和之后将指针设置为NULL之间有区别吗?
例如,两者之间是否有任何区别
char* c = NULL;
Run Code Online (Sandbox Code Playgroud)
和
char* c = malloc(sizeof(char));
c = NULL;
Run Code Online (Sandbox Code Playgroud)
每个陈述的含义是什么(如果有的话),并且free(c)在每种情况下的召唤有什么不同?
在malloc()用于分配内存空间之后,我很好奇指针究竟是什么?该联机帮助页告诉我calloc()初始化已分配的内存空间为零.
malloc()函数分配大小字节并返回指向已分配内存的指针. 内存未初始化.如果size为0,则malloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.
和
calloc()函数为每个大小为字节的nmemb元素数组分配内存,并返回指向已分配内存的指针. 内存设置为零.如果nmemb或size为0,则calloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.
我在C中为C(haha)创建了一个非常简短的示例程序:
int main() {
char *dynamic_chars;
unsigned amount;
printf("how much bytes you want to allocate?\n");
scanf("%d", &amount);
dynamic_chars = (char*)malloc(amount*sizeof(char));
printf("allocated:\n%s\n", dynamic_chars);
free(dynamic_chars);
return 0;
Run Code Online (Sandbox Code Playgroud)
}
但是,在执行此代码时,它只输出任何内容.如果我初始化内存,例如0xFFFF使用循环初始化每个字节,那么程序会向我显示我期望的内容.内存空间实际存在,因为我不会收到错误声称我正在尝试访问未初始化的变量.
由于内存空间通常不会被删除但被标记为可重写,我想知道如果通过执行我的程序,我是否应该能够看到以前使用的随机内存字节?但我什么都看不到,所以我真的很困惑malloc().
关于malloc()或者可能是内存使用的另一件事,关于我的程序是有趣的:如果我使用calloc(),分配内存,我可以通过例如监视来跟踪我的程序的实际内存使用情况.例如,如果我告诉我的程序,每次分配1.000.000.000字节的内存calloc()我将在我的系统监视器中看到以下内容:
c
malloc
initialization
dynamic-memory-allocation
new int[0]在C ++中是允许的,但是std::allocator<int>().allocate(0)定义明确?更笼统地说,所有分配器都必须接受0作为分配参数吗?
编辑:阅读我测试了Visual Studio的答案后std::allocator:allocate(0)给nullptr
deallocate(nullptr, anything) 是点头。
因此,使用nullptr是一个很好的建议,但是标准不要求deallocate(nullptr, 0)是nop,请参见是否允许使用C ++ allocator :: deallocate(NULL,1)?
c++ memory-management allocator dynamic-memory-allocation language-lawyer