sizeof

Theano教程:Python的内存管理

跟風遠走 提交于 2020-01-19 04:43:29
在写大型程序时候的一大挑战是如何保证最少的内存使用率。但是在Python中的内存管理是比较简单的。Python显示分配内存,使用引用计数系统管理对象,当指向某一个对象的引用数变为 0 的时候,该对象所占的内存就会被释放。理论上听起来很不错,也很简单,但是在实践中,我们需要知道一些Python内存管理的知识从而让程序在运行过程中能够更加高效地使用内存。其中一个方面我们需要知道的是基本的Python对象所占空间的大小,另一方面我们需要知道的是Python在内部到底是如何管理内存的。 基本对象 一个 int 对象占多大空间呢? C/C++程序员会说它是由具体的机器决定的,可能是32为或者64位,因此它最多占8个字节(一个字节8位)。那么在Python中也是如此吗? 下面写一个函数来揭示出对象占多大的空间(某些情况下需要递归,比如某一个对象类型不是基本的数据类型): 1 import sys 2 3 def show_sizeof(x, level=0): 4 5 print "\t" * level, x.__class__, sys.getsizeof(x), x 6 7 if hasattr(x, '__iter__'): 8 if hasattr(x, 'items'): 9 for xx in x.items(): 10 show_sizeof(xx, level + 1) 11

golang之不安全编程

无人久伴 提交于 2020-01-19 00:38:16
楔子 不安全编程?用golang以来也没发现有啥不安全的啊,而且golang有垃圾回收,也不需要我们来管理内存。当听到不安全编程这几个字,唯一能想到的也就是指针了,只有指针才可能导致不安全问题。我们知道golang中是有指针的,但是golang的指针并不能像C语言中的指针一样,可以进行运算,所以golang中的指针既提供了指针的便利性,又保证了安全。但是在golang中,可以通过一个叫做 unsafe 的包让指针突破限制,从而进行运算,一旦用不好会导致很严重的问题,但是用好了在某些场景下能够带来很大的便利,所以我们说这是不安全编程。但即便如此,我们还是可以使用的,而且golang的内部也在大量的使用unsafe这个包。 golang中的指针 尽管golang的指针没有C的指针那么强大,但是能够获取一个变量的地址,并且能通过地址来改变存储的值,我个人认为已经足够了。 package main import "fmt" func pass_by_value(num int){ num = 3 } func pass_by_pointer(num *int){ *num = 3 num = nil } func main() { num := 1 pass_by_value(num) fmt.Println("传递值:", num) //传递值: 1 pass_by_pointer(

C语言学习系列:位域

浪尽此生 提交于 2020-01-18 13:55:53
所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。 位域声明 struct bitFieldName { type [member_name] : width ; }exampleVar; 在结构体定义时,我们可以指定某个成员变量所占用的二进制位数(Bit),这就是位域。 位域的宽度不能超过它所依附的数据类型的长度。通俗地讲,成员变量都是有类型的,这个类型限制了成员变量的最大长度, : 后面的数字不能超过这个长度。 只有有限的几种数据类型可以用于位域。这几种数据类型是 int、signed int 和 unsigned int,_Bool 。但编译器在具体实现时都进行了扩展,额外支持了 char、signed char、unsigned char 以及 enum 类型。 位域的存储 位域的具体存储规则如下: 1.当相邻成员的类型相同时,如果它们的位宽之和小于类型的 sizeof 大小,那么后面的成员紧邻前一个成员存储,直到不能容纳为止;如果它们的位宽之和大于类型的 sizeof 大小,那么后面的成员将从新的存储单元开始,其偏移量为类型大小的整数倍。 #include <stdio.h> int main(){ struct bs{ unsigned m:

trie树 & ac自动机

拟墨画扇 提交于 2020-01-17 01:37:09
trie树 trie树就是字典树,可以理解为单词树,树上每条边是字母,被标记的节点表示根到这个节字母组成了单词。 数据结构:用二维数组trie[maxn][N],tire[u][c]表示树上编号为u的父节点以边为c单词连接到的儿子的编号。 创建trie树:每次添加一个单词,若当前路径已建立此以连接此单词为边的儿子节点就沿着走,否则建立新的节点。 学习链接: 浅谈Trie树 Trie树模板 const int maxn = 5e5 + 7 ; const int N = 26 ; struct Tire { int trie [ maxn ] [ N ] , tot ; bool book [ maxn ] ; void Init ( ) { memset ( trie , 0 , sizeof trie ) ; memset ( book , 0 , sizeof book ) ; tot = 0 ; } void Insert ( string a ) { int u = 0 ; for ( int i = 0 ; i < a . size ( ) ; ++ i ) { int v = a [ i ] - 'a' ; if ( trie [ u ] [ v ] == 0 ) { trie [ u ] [ v ] = ++ tot ; } u = trie [ u ] [ v ]

sizeof applied to the name of an array vs a pointer to the first element of the array

孤街浪徒 提交于 2020-01-16 07:26:32
问题 Suppose I declare int v[]={1,2,3,4,5}; I have been taught that v is a pointer to the first element in the v array. When I call apply sizeof to v , it returns 20, which I know is 5*sizeof(int) , because there are 5 elements in the array. v+0 is also a pointer to the first element in the array, but sizeof(v+0) is 4. Why is sizeof(v) =20 and sizeof(v+0) =4? I would expect that sizeof(v) also returned 4, as v is a pointer, but instead it somehow also contains the information regarding the number

洛谷P4238【模板】多项式求逆

◇◆丶佛笑我妖孽 提交于 2020-01-16 05:38:28
洛谷P4238 多项式求逆: http://blog.miskcoo.com/2015/05/polynomial-inverse 注意: 直接在点值表达下做$B(x) \equiv 2B'(x) - A(x)B'^2(x) \pmod {x^n}$是可以的,但是一定要注意,这一步中有一个长度为n的和两个长度为(n/2)的多项式相乘,因此要在DFT前就扩展FFT点值表达的“长度”到2n,否则会出错(调了1.5个小时) 备份 版本1: 1 #prag\ 2 ma GCC optimize(2) 3 #include<cstdio> 4 #include<algorithm> 5 #include<cstring> 6 #include<vector> 7 #include<cmath> 8 using namespace std; 9 #define fi first 10 #define se second 11 #define mp make_pair 12 #define pb push_back 13 typedef long long ll; 14 typedef unsigned long long ull; 15 const int md=998244353; 16 const int N=2097152; 17 int rev[N]; 18 void init(int

sizeof(array) / sizeof(int) [duplicate]

坚强是说给别人听的谎言 提交于 2020-01-15 07:29:04
问题 This question already has answers here : C sizeof a passed array [duplicate] (7 answers) Closed 6 years ago . Within a function I have declared an array: int char_count_array[118] = {0}; Later on, I pass this array to a function and calculate the following: int xx = sizeof(char_count_array); int xy = sizeof(char_count_array)/sizeof(int); However, the result I get is: xx = 4 xy = 1 I thought I would be getting: xx = 472(118 * 4) xy = 118 (472 / 4) . Would anyone know what I am doing wrong here

Linux-C网络编程

旧巷老猫 提交于 2020-01-15 00:13:56
简介 基础是TCP/IP协议,网上资料很多不再赘述。 推荐《图解TCP/IP》 socket编程 网络字节序 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出, 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存 因此,网络数据流的地址规定:先发出的数据是低地址,后发出的数据是高地址 TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。 例如UDP段格式,地址0-1是16位的源端口号,如果这个端口号是1000(0x3e8) 则地址0是0x03,地址1是0xe8,也就是先发0x03,再发0xe8 这16位在发送主机的缓冲区中也应该是低地址存0x03,高地址存0xe8。 但是,如果发送主机是小端字节序的,这16位被解释成0xe803,而不是1000。 因此,发送主机把1000填到发送缓冲区之前需要做字节序的转换。 同样地,接收主机如果是小端字节序的,接到16位的源端口号也要做字节序的转换。 如果主机是大端字节序的,发送和接收都不需要做转换。 同理,32位的IP地址也要考虑网络字节序和主机字节序的问题。 网络字节序转换 为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行 可以调用以下库函数做网络字节序和主机字节序的转换 #include <arpa/inet.h> uint32_t htonl

Linux学习之socket编程(一)

家住魔仙堡 提交于 2020-01-15 00:13:43
socket编程 socket的概念:     在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket。   在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。socket本身有“插座”的意思,因此用来描述网络连 接的一对一关系。   TCP/IP协议最早在BSD UNIX上实现,为TCP/IP协议设计的应用层编程接口称为socketAPI。   本章的主要内容是socket API,主要介绍TCP协议的函数接口,最后介绍UDP协议和UNIXDomain Socket的函数接口。 socket socket-api 1.基础知识 网络字节序     我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢?发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。   TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节

在一张图片中隐藏另一张图片

我的梦境 提交于 2020-01-14 11:42:48
首先是在灰度图中隐藏灰度图 因为是交作业嘛,为了简单就依次在每个字节中隐藏信息,如果有什么不想让人看见的东西要隐藏,可以自己有选择性的隐藏 这里先得到两张灰度图 将第二幅图片当作秘密图片插入一图,这里先将第二幅图置乱 这里采用的是菱形置乱的方法,即在菱形中从第一行开始从左向右依次写入1到n,替换时从第一列从上到下依次读取序号,即第一列序号对应的像素作为第一个像素 代码如下,这里我用的算法比较笨就将就吧,恢复置乱时只需要更改其中一条代码,在代码中已说明 再说明一下,我是将菱形补全为正方形,用0填充,方法虽笨但是能用 /* 对图片进行置乱处理 2015年6月2日20:02:18 blog:http://www.cnblogs.com/wd1001/ */ #include<stdio.h> #include<malloc.h> #include<stdlib.h> /* 位图头结构 */ #pragma pack(1) typedef struct tagBITMAPFILEHEADER { unsigned char bfType[2];//文件格式 unsigned long bfSize;//文件大小 unsigned short bfReserved1;//保留 unsigned short bfReserved2; unsigned long bfOffBits; /