我需要生成一个非常大的文本文件.每一行都有一个简单的格式:
Seq_num<SPACE>num_val
12343234 759
Run Code Online (Sandbox Code Playgroud)
我们假设我将生成一个包含1亿行的文件.我尝试了两种方法,令人惊讶的是它们提供了非常不同的时间性能.
对于超过100米的循环.在每个循环中我创建短字符串seq_num<SPACE>num_val,然后我将其写入文件.这种方法需要花费很多时间.
## APPROACH 1
for seq_id in seq_ids:
num_val=rand()
line=seq_id+' '+num_val
data_file.write(line)
Run Code Online (Sandbox Code Playgroud)对于超过100米的循环.在每个循环中我创建短字符串seq_num<SPACE>num_val,然后将其附加到列表中.当循环结束时,我迭代列表项并将每个项写入文件.这种方法花费的时间少得多.
## APPROACH 2
data_lines=list()
for seq_id in seq_ids:
num_val=rand()
l=seq_id+' '+num_val
data_lines.append(l)
for line in data_lines:
data_file.write(line)
Run Code Online (Sandbox Code Playgroud)注意:
所以方法1必须花费更少的时间.什么提示我缺少什么?
我在嵌入式C源文件中遇到了以下定义:
const preamble_t OAD_Preamble @ ".preamble" =
{
HAL_OAD_RC_MAX, // Default program length of max if not using post-processing tool.
OAD_MANUFACTURER_ID, // Manufacturer ID
OAD_TYPE_ID, // Image Type
0x00000001 // Image Version
};
Run Code Online (Sandbox Code Playgroud)
我不知道@部分,你能帮我解决这个问题吗?
编辑:这是在IAR编译器中,与TI SoC一起使用.
我有一个非常简单的代码将大写转换为小写:
#include <stdio.h>
int main()
{
char c;
int i=0;
for (i=0;i<10;i++){
c=getchar();
c=c-'A'+'a';
printf("%c\n",c );
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但运行这个简单的代码总是*在输出时有一个额外的字符.它打印下面的char *.看一看:
D
d
*
D
d
*
E
e
*
Run Code Online (Sandbox Code Playgroud)
这是从哪里来的?
我知道在 C 中,在应用程序可以开始之前main(),某些实体必须:
问题 1 - 做这些事情的实体是什么?谁写的?
问题 2 - C++ 中还有其他东西吗?我假设对象构造函数和初始化都是在应用过程中完成的,之后 main()
在KR C book 112页中,它说:
int (*arr1)[10];
Run Code Online (Sandbox Code Playgroud)
是一个指向10个整数数组的指针.我不知道上面和下面有什么区别:
int arr2[10];
Run Code Online (Sandbox Code Playgroud)
1- arr2本身不是指向10个整数数组的指针吗?(因为数组的名称本身就是指针.)
2-如果数组的名称是阵列地址和指针数组,则两个arr1和arr2是指向整数数组,是不是这样的吗?
0x0\1以下代码中的含义是什么?我在嵌入式C代码中找到了这个:
uint16 size;
...
size += (size & 0x0\1);
Run Code Online (Sandbox Code Playgroud)
它是德州仪器发布代码的一部分.它在IAR ARM IDE中编译.
我刚刚了解了不同的内存段,例如:文本,数据,堆栈和堆。我的问题是:
1-这些部分之间的边界在哪里定义?是在Compiler还是OS中?
2-编译器或OS如何知道每个部分属于哪些地址?我们应该在任何地方定义它吗?
内存管理是底层操作系统提供的服务.当我们调用malloc()/free()并且没有运行的操作系统时(例如裸机嵌入式系统),如何处理内存分配和跟踪?
应该有一个实体可以跟踪哪些地址是免费的,哪些地址不是.这是OS内存管理单元.malloc()/free()然后必须调用OS系统调用.所以没有OS意味着没有malloc()/free().假设这个我错了吗?
更新:
所有答案都指出,malloc/free可以使用静态池分配(当没有OS可用时)或使用sbrk/brk哪些是内核系统调用.问题是如何malloc/free知道下面是否有内核?
答案(见"Kuba Ober"评论,见下面的回答):
malloc不需要知道任何东西,因为你链接你的项目的C库是特定于目标的:如果你为Linux开发,你使用Linux的C库,不同于为OS X或Windows开发时,或裸骨ARM Cortex M0.或者,哎呀,准系统x86.编写C库的人员知道如何实现它,以便它可以在所需的目标上运行.例如,x86的准系统C库将使用EFI和ACPI查询硬件或BIOS未使用的可用RAM块列表,然后使用它们来完成分配请求.
我作为初学者在嵌入式系统上工作,遇到过像main()函数开始之前运行的文件start.s或cstart文件.这些或类似文件的目的是什么?我们告诉系统的哪些信息?
c ×7
embedded ×5
algorithm ×1
arrays ×1
c++ ×1
compilation ×1
eclipse ×1
firmware ×1
getchar ×1
iar ×1
kr-c ×1
large-data ×1
large-files ×1
loops ×1
performance ×1
pointers ×1
python ×1
types ×1