【学习笔记】C++每日一记[20240516]

发布于:2024-05-17 ⋅ 阅读:(57) ⋅ 点赞:(0)

main函数

main函数也称主函数,许多书上特意强调main函数是整个函数的入口,但这种说法不正确,实际上main函数在执行之前已经做了一些初始化工作,在main函数执行之后也有一些扫尾工作。

根据C99的标准,main函数有两种形式:一种是无参,一种是带参。

int main()

int main(int argc, char *argv[])

两种形式的main函数的返回值都是int类型,虽然有些程序员习惯将main函数的返回值写成void类型,并且在某些编译器上也能够正常执行,但这并不是标准的main函数,标准main函数的返回值是int类型,所以main函数中的最后一行代码是return 0,其中0表示main函数正确结束。

main函数的参数是固定的:第一个参数argc是argument count的缩写,整数类型,表示通过命令行输入的参数个数;第二个参数argv是argument value的缩写,字符串指针数组类型,其中首元素argv[0]是程序的名字,其余元素为通过命令行输入的参数。

简述main函数执行前后都发生了什么

main函数第一行代码执行之前会调用全局对象和静态对象的构造函数,初始化全局变量和静态变量;main函数最后一行代码执行之后会调用atexit中注册的函数,并且调用顺序与注册顺序相反。

实践,返回一个64整数倍的内存

要想保证返回的地址中能存在能被64整除的地址,最保险的办法是额外申请64个地址空间,这样即便申请空间的首地址刚好错过64的倍数,加上额外的64个地址空间也能保证在整个地址空间中,前64个地址空间必然存在一个64整倍数的地址,并且后面剩余的地址空间不少于最初申请的大小。

void* align64malloc(int size)
{
	void *ptr = malloc(size + 64 +sizeof(void*));
	if(!ptr)
	{
		return NULL;
	}
	ptr = (char*)ptr + sizeof(void*);
	*((int*)(((int)ptr + 64 - (int)ptr % 64)-sizeof(void*))) = ((int)ptr - sizeof(void*));
	return(void*)((int)ptr +64 - (int)ptr %64);
}

#include <iostream>
#include <cstdlib>

void* align64malloc(int size)
{
	void *ptr = malloc(size + 64 + sizeof(void*));
	if (!ptr)
	{
		return NULL;
	}
	ptr = (char*)ptr + sizeof(void*);
	*((int*)(((int)ptr + 64 - (int)ptr % 64) - sizeof(void*))) = ((int)ptr - sizeof(void*));
	return (void*)((reinterpret_cast<int>(ptr) + 64 - reinterpret_cast<int>(ptr) % 64));
}

int main()
{
	int size = 100;
	void* aligned_ptr = align64malloc(size);
	if (aligned_ptr)
	{
		std::cout << "Aligned memory block allocated successfully." << std::endl;
	}
	else
	{
		std::cout << "Failed to allocate aligned memory block." << std::endl;
	}

	free(aligned_ptr); // Remember to free the allocated memory

	return 0;
}


分配成功,但是存在Debug异常。


网站公告

今日签到

点亮在社区的每一天
去签到