Search / Sort
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
#ifndef INCLUDED_C_SWAP_H
|
||||
#define INCLUDED_C_SWAP_H
|
||||
|
||||
#ifndef INCLUDED_C_TYPES_H
|
||||
#include <c_Types.h>
|
||||
#endif /*INCLUDED_C_TYPES_H*/
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------ */
|
||||
/* */
|
||||
|
||||
/**
|
||||
* @brief 泛型就地内存块数据互换接口
|
||||
*
|
||||
* @param a 指向第一个待交换对象的泛型指针
|
||||
* @param b 指向第二个待交换对象的泛型指针
|
||||
* @param size 待交换对象占用的内存字节大小 (sizeof)
|
||||
*/
|
||||
C_STATIC_FORCE_INLINE
|
||||
void c_Swap(void* a, void* b, c_size_t size) {
|
||||
// 边界与自等性防御:指针无效、长度为0、或者两个指针指向同一个内存物理地址时无需交换
|
||||
if (!a || !b || size == 0 || a == b) {
|
||||
return;
|
||||
}
|
||||
|
||||
char* p1 = (char*)a;
|
||||
char* p2 = (char*)b;
|
||||
|
||||
// 在栈上开辟一个小缓冲区。256 字节足以一次性吃下绝大多数基本类型和中小型结构体
|
||||
char temp_buf[256];
|
||||
c_size_t bytes_left = size;
|
||||
|
||||
// 分块拷贝机制:无视对象体量,即便面临超出 256 字节的巨型结构体也能安全互换
|
||||
while (bytes_left > 0) {
|
||||
const c_size_t chunk = (bytes_left < sizeof(temp_buf)) ? bytes_left : sizeof(temp_buf);
|
||||
|
||||
memcpy(temp_buf, p1, chunk);
|
||||
memcpy(p1, p2, chunk);
|
||||
memcpy(p2, temp_buf, chunk);
|
||||
|
||||
p1 += chunk;
|
||||
p2 += chunk;
|
||||
bytes_left -= chunk;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /*INCLUDED_C_SWAP_H*/
|
||||
Reference in New Issue
Block a user